Linq 将EntityObject项的列表枚举为特定EF对象的列表
在我的DAL中,我有一个数据访问对象,可以将数据库记录重试到EntityObject列表: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); 但是,这不是创建了一个列表的副本吗将我的内存占用量增加了一倍,这将是大型集合的一个问题吗 如果是这样的话,有没有一种方法可以通过这个列表进行
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是传递到实体列表的构造函数中的局部变量。。。希望这是有意义的…@DeanKugaSelect(p=>p作为产品)
向我建议,此特定列表中的所有实体都将是Product
s。您收到的答案建议使用of type()
;我附议(实际上是附议)您能解释一下为什么不创建列表吗?这似乎是一个简单得多的解决方案,在当前接受列表的任何位置接受列表(其中T:EntityObject
)通常不是问题,因为这是“通用的”列表可以容纳许多不同的EF对象,这样我就可以在基类中只处理一个列表,而不是为几十个不同的特定EF对象创建几十个列表……我很难理解第一个pList
和第二个之间的关系。什么是数据实体?这与实体
相同吗?是的,Data.entities是一个公共属性,使用Data.entities作为BI对象使用的DAL类中的私有支持字段。。。pList是传递到实体列表的构造函数中的局部变量。。。希望这是有意义的…@DeanKugaSelect(p=>p作为产品)
向我建议,此特定列表中的所有实体都将是Product
s。您收到的答案建议使用of type()
;我是附议(