2017-02-14 8 views
2

Мне было любопытно некоторое время о том, как Dapper (или, возможно, другие ORM) обрабатывают поиск объектов в сочетании с LINQ.Выполняет ли Dapper полный объект из базы данных до операций Linq?

Если у меня есть класс вроде этого:

public static IEnumerable<SitePage> GetAll() 
{ 
    using (IDbConnection cn = new SqlConnection(g.Global.CONX)) 
    { 
     cn.Open(); 
     return cn.GetAll<SitePage>(); 
    } 
} 

и я построить запрос следующим образом:

var result = SitePage.GetAll().Select(c=> new { c.id, c.PageUrl, c.ParentId }); 

Мне интересно, если в фоновом режиме, весь набор запись получает тянут в том числе все остальные столбцы (которые могут содержать действительно большие varchars), или Dapper понимает из этого запроса только для того, чтобы вытащить столбцы, которые я запрашиваю из sql db? Я понимаю, что это своего рода новичок, но я хочу лучше понять взаимодействие Dapper/LINQ.

Аналогичный вопрос был отправлен здесь: selecting-specific-columns-using-linq-what-gets-transferred, хотя я не был уверен, был ли полностью ответ. У плаката было 2 вопроса, а также не использовались лямбда-выражения, которые я обычно предпочитаю.

Ответ на этот вопрос поставит меня под сомнение (и, возможно, изменит способ кодирования, поскольку я был осторожен и чувствую, что я пишу слишком много кода через явный sql).

+1

См. http://stackoverflow.com/a/35956207/5779732 –

+0

@ A_J Ссылка, которую вы предоставили, также очень полезна и является хорошим напоминанием, потому что я думаю, что видел ее в прошлом. – secretwep

ответ

5

Dapper не преобразует ваши лямбда-выражения в SQL, поэтому в вашем случае SQL-запрос, который генерирует Dapper, возвращает полные экземпляры SitePage.

Быстрый способ узнать, если это так, если взглянуть на подпись метода GetAll<T> Dapper. Поскольку он возвращает IEnumerable<T>, это означает, что он возвращает коллекцию T, поэтому любой оператор, который вы используете после этого - например, Select в вашем случае, будет применен к полной коллекции. Короче говоря, вы больше не находитесь в мире Dapper после звонка GetAll<T>.

Если вы использовали в прошлом полнофункциональные ORM - я имею в виду больше возможностей, не обязательно лучше - например, Entity Framework или NHibernate, вы заметите, что некоторые API возвращают IQueryable<T>, который представляет запрос, но был выполнен. Таким образом, операторы, которые вы используете на IQueryable<T>, например Select и Where, на самом деле изменить запрос. Когда вы выполняете материализацию запроса путем его итерации или вызова ToList или ToArray на нем, ORM преобразует ваше дерево выражений запроса в SQL и отправляет этот запрос в базу данных.

+0

"** Если вы использовали в прошлом полноценные ORM - тем более я имею в виду больше возможностей, не обязательно лучше **" полностью согласен. Upvoted. –

+0

Это разъяснение действительно полезно для меня, и я ценю контраст, который вы описываете в отношении EF, который я также использовал в более ограниченной степени. – secretwep