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

Linq 将EntityObject项的列表枚举为特定EF对象的列表,linq,entity-framework,.net-4.0,Linq,Entity Framework,.net 4.0,在我的DAL中,我有一个数据访问对象,可以将数据库记录重试到EntityObject列表: private List<EntityObject> entities; var pList = context.Products.Where(...); entities = new List<EntityObject>(pList); 但是,这不是创建了一个列表的副本吗将我的内存占用量增加了一倍,这将是大型集合的一个问题吗 如果是这样的话,有没有一种方法可以通过这个列表进行

在我的DAL中,我有一个数据访问对象,可以将数据库记录重试到EntityObject列表:

private List<EntityObject> entities;

var pList = context.Products.Where(...);
entities = new List<EntityObject>(pList);
但是,这不是创建了一个
列表的副本吗
将我的内存占用量增加了一倍,这将是大型集合的一个问题吗


如果是这样的话,有没有一种方法可以通过这个
列表进行枚举,而不是转换回
产品
,然后通过该副本进行枚举?

没有,只调用
Select()
(不使用
ToList()
new List()
)不会创建另一个
列表,因此,您不必担心内存占用。它使用您提供的lambda计算
产品的序列。如果lambda包含一些复杂的计算,并且您对结果进行了多次迭代,这可能会导致性能问题,但这里的情况并非如此

您可以使用两种不同的方式来表示相同的强制转换,但它们有一些不同,当列表中包含的对象不是
Product
s时会发生什么情况:

  • 选择(p=>p作为产品)
    :您正在使用的产品。如果序列包含的对象不是
    Product
    s,它们将变成
    null
    s
  • OfType()
    :非
    产品将被过滤掉
  • Cast()
    :如果序列包含非
    产品
    s,则会引发异常。这可能是您想要的版本

  • 不,只调用
    Select()
    (不使用
    ToList()
    new List()
    )不会创建另一个
    列表,因此您不必担心内存占用。它使用您提供的lambda计算
    产品的序列。如果lambda包含一些复杂的计算,并且您对结果进行了多次迭代,这可能会导致性能问题,但这里的情况并非如此

    您可以使用两种不同的方式来表示相同的强制转换,但它们有一些不同,当列表中包含的对象不是
    Product
    s时会发生什么情况:

    • 选择(p=>p作为产品)
      :您正在使用的产品。如果序列包含的对象不是
      Product
      s,它们将变成
      null
      s
    • OfType()
      :非
      产品将被过滤掉
    • Cast()
      :如果序列包含非
      产品
      s,则会引发异常。这可能是您想要的版本
    但是这不就是我的清单的副本吗 此集合的内存占用,这将与 大收藏

    不,这只会复制对实体的引用,因此不应该担心

    还有一种更安全的方法是:

    var pList = Data.Entities.OfType<Product>().ToList();
    
    var pList=Data.Entities.OfType().ToList();
    
    或者,您可以通过产品直接列举:

    foreach(var product in Data.Entities.OfType<Product>())
    {
       //..
    }
    
    foreach(Data.Entities.OfType()中的var乘积)
    {
    //..
    }
    
    但是这不就是我的清单的副本吗 此集合的内存占用,这将与 大收藏

    不,这只会复制对实体的引用,因此不应该担心

    还有一种更安全的方法是:

    var pList = Data.Entities.OfType<Product>().ToList();
    
    var pList=Data.Entities.OfType().ToList();
    
    或者,您可以通过产品直接列举:

    foreach(var product in Data.Entities.OfType<Product>())
    {
       //..
    }
    
    foreach(Data.Entities.OfType()中的var乘积)
    {
    //..
    }
    
    您能解释一下为什么不创建
    列表吗?这似乎是一个简单得多的解决方案,在当前接受
    列表的任何位置接受
    列表(其中T:EntityObject
    )通常不是问题,因为这是“通用的”列表可以容纳许多不同的EF对象,这样我就可以在基类中只处理一个列表,而不是为几十个不同的特定EF对象创建几十个列表……我很难理解第一个
    pList
    和第二个之间的关系。什么是数据实体?这与
    实体
    相同吗?是的,Data.entities是一个公共属性,使用Data.entities作为BI对象使用的DAL类中的私有支持字段。。。pList是传递到实体列表的构造函数中的局部变量。。。希望这是有意义的…@DeanKuga
    Select(p=>p作为产品)
    向我建议,此特定列表中的所有实体都将是
    Product
    s。您收到的答案建议使用
    of type()
    ;我附议(实际上是附议)您能解释一下为什么不创建
    列表吗?这似乎是一个简单得多的解决方案,在当前接受
    列表的任何位置接受
    列表(其中T:EntityObject
    )通常不是问题,因为这是“通用的”列表可以容纳许多不同的EF对象,这样我就可以在基类中只处理一个列表,而不是为几十个不同的特定EF对象创建几十个列表……我很难理解第一个
    pList
    和第二个之间的关系。什么是数据实体?这与
    实体
    相同吗?是的,Data.entities是一个公共属性,使用Data.entities作为BI对象使用的DAL类中的私有支持字段。。。pList是传递到实体列表的构造函数中的局部变量。。。希望这是有意义的…@DeanKuga
    Select(p=>p作为产品)
    向我建议,此特定列表中的所有实体都将是
    Product
    s。您收到的答案建议使用
    of type()
    ;我是附议(