在我的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
而不是枚举该副本?
答案 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>())
{
//..
}