Перечисление списка элементов EntityObject в виде списка определенных объектов EF - PullRequest
0 голосов
/ 16 февраля 2012

В моем DAL у меня есть объект доступа к данным, который извлекает записи базы данных в список EntityObject:

private List<EntityObject> entities;

var pList = context.Products.Where(...);
entities = new List<EntityObject>(pList);

Чтобы работать с этим списком на моем уровне BI, мне нужно пройти через этот List<EntityObject> каксписок Product объектов.Я могу легко конвертировать обратно так:

var pList = Data.Entities.Select(p => p as Product);

, но разве это не создает копию List<EntityObject>, удваивающую мой объем памяти для этой коллекции, что было бы проблемой для больших коллекций?

Если так, есть ли способ перечислить это List<EntityObject> как List<Product> вместо преобразования обратно в Product и чем перечислить через эту копию?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

но это не создает копию списка, удваивающую мой след памяти для этой коллекции, которая будет проблемой с большие коллекции?

Нет, это просто сделало бы копию ссылок на сущности, так что это не должно быть проблемой.

Также более безопасный способ сделать ваш бросок будет:

var pList = Data.Entities.OfType<Product>().ToList();

Или вы можете просто перечислить через продукты:

foreach(var product in Data.Entities.OfType<Product>())
{
   //..
}
2 голосов
/ 16 февраля 2012

Нет, просто вызов Select() (без добавления ToList() или new List()) не создает другого List, поэтому вам не нужно беспокоиться об объеме памяти.Что он делает, так это то, что он вычисляет последовательность Products, используя предоставленную вами лямбду.Если лямбда содержит сложные вычисления, и вы несколько раз повторяете результат, это может вызвать проблемы с производительностью, но это не так.

Есть два альтернативных способа, которые вы можете использовать для выражения одного и того же приведения:но у них есть некоторые различия в том, что происходит, когда список содержит объекты, которые не Product s:

  • Select(p => p as Product): тот, который вы используете прямо сейчас.Если последовательность содержит объекты, которые не являются Product с, они превратятся в null с.
  • OfType<Product>(): не Products будет отфильтровано.
  • Cast<Product>(): если последовательность содержит не Product s, она генерирует исключение.Это, вероятно, версия, которую вы хотите.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...