多年来,我已经阅读了几个不同的来源,这些来源表明在存储数据集合时,List< T>当你想要插入对象时,它是有效的,并且IEnumerable< T>最适合枚举一个集合.
在LINQ-to-Entities中,有AsEnumerable()函数,它将返回IEnumerable< T>,但在您开始枚举列表之前,它不会解析LINQ语句创建的SQL.
如果我想将LINQ中的对象存储到集合中的实体,然后再查询该集合,该怎么办?
使用此策略会导致通过添加WHERE子句并分别查询每个记录来解析SQL.我特别不想这样做,因为我试图限制网络聊天:
var myDataToLookup = context.MyData.AsEnumerable();
for(var myOtherDatum in myOtherDataList)
{
// gets singular record from database each time.
var myDatum = myDataToLookup.SingleOrDefault(w => w.key == myOtherDatum.key)
}
如何解决SQL的问题,以便myDataToLookup实际上包含内存中的数据?我试过ToArray:
var myDataToLookup = context.MyData.ToArray();
但我最近了解到它实际上使用的内存比ToList更多:
Is it better to call ToList() or ToArray() in LINQ queries?
我应该使用连接吗?
var myCombinedData = from o in myOtherDataList
join d in myDataToLookup on
o.key equals d.key
select { myOtherData: o, myData: d};
我应该使用ToDictionary并将我的密钥存储为字典的关键字吗?或者我担心这个太多了?
最佳答案 如果你正在使用LINQ to Entities,那么你不应该担心ToArray是否比ToList慢.它们在性能方面几乎没有区别,LINQ to Entities本身无论如何都将成为瓶颈.
关于字典.它是一种针对按键读取而优化的结构.但是,添加新商品需要额外付费.所以,如果你会按键阅读很多并且不经常添加新项目那么就是这样.但说实话 – 你可能根本不应该打扰.如果数据量不够大,您将看不到差异.