枚举EntityObject项列表作为特定EF对象的列表

时间:2012-02-15 21:02:05

标签: linq entity-framework .net-4.0

在我的DAL中,我有一个数据访问对象,它将数据库记录检索到EntityObject List:

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 个答案:

答案 0 :(得分:2)

不,仅调用Select()(不使用ToList()new List()进行操作)不会创建另一个List,因此您不必担心内存占用。它的作用是使用你提供的lambda计算Products的序列。如果lambda包含一些复杂的计算并且你多次迭代结果,这可能会导致性能问题,但这不是这种情况。

您可以使用两种替代方法来表达相同的强制转换,但是当列表包含不是Product的对象时会发生一些差异:

  • Select(p => p as Product):您现在正在使用的那个。如果序列包含的对象不是Product,则它们将变为null s。
  • OfType<Product>():非Products将被过滤掉。
  • Cast<Product>():如果序列包含非Product s,则会抛出异常。这可能是你想要的版本。

答案 1 :(得分:2)

  

但是这不会创建一个列表的副本加倍我的   这个集合的内存占用将是一个值得关注的问题   大集合?

不,这只会将引用的副本复制到实体中,因此无关紧要。

进行演员表演的另一种更安全的方法是:

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

或者您可以直接枚举产品:

foreach(var product in Data.Entities.OfType<Product>())
{
   //..
}