Есть ли какие-либо издержки с LINQ или Entity Framework при получении больших столбцов как части объекта? - PullRequest
0 голосов
/ 29 января 2009

Допустим, у вас есть таблица, содержащая статьи, и вы хотите отобразить их список, исключая фактический текст статьи. Когда вы получаете список объектов статьи с использованием LINQ или Entity Framework, есть ли много дополнительных затрат, связанных с получением этого текстового столбца? Я предполагаю, что когда вы начнете перечислять список, текст статьи будет храниться в памяти, пока объекты не будут уничтожены.

Так имеет ли смысл создавать промежуточный объект, который не содержит текстового столбца? Если так, как бы вы это сделали? Сделать класс внутри вашего DAL, позволить ORM автоматически создать его, настроив хранимую процедуру, или какой-то другой процесс?

Ответы [ 2 ]

1 голос
/ 29 января 2009

Накладные расходы невелики (только стоимость отправки данных по сети), но если вам не нужны данные, не возвращайте их. Я считаю, что самый простой способ - использовать анонимные типы:

from a in Context.Articles
select new {Name = a.Name, Author = a.Author};

Поскольку вы фактически не материализуете ни одного экземпляра Article, Entity Framework не нужно будет заполнять все свойства экземпляра.

0 голосов
/ 29 января 2009

Если вам не нужны данные, вам определенно следует создать другой тип. По соглашению я обычно называю этот класс "nnnInfo" или "nnnListItem". Чтобы создать ArticleListItem, в L2S просто перетащите таблицу в свой конструктор DataContext во второй раз. Затем переименуйте его из «Article1» в «ArticleListItem» и удалите ненужные свойства (rt click, delete). В EF процесс будет похожим. Как отмечает Крейг, вы можете использовать анонимные типы, но, создав конкретный тип, вы сможете повторно использовать его в своем приложении, открывать доступ через службы и т. Д.

Второй способ сделать это - создать класс вручную и написать метод расширения для возврата ArticleListItem:

public static IQueryable<ArticleListItem> ToListItems(this IQueryable<Article> articles)
{
 return from a in articles select new ArticleListItem{ Title = a.Title, ...}
}

Это позволит вам «навести» любые запросы на Article как ArticleListItem ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...