c# – 用于存储从LINQ到实体的数据的最有效集合?

多年来,我已经阅读了几个不同的来源,这些来源表明在存储数据集合时,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本身无论如何都将成为瓶颈.

关于字典.它是一种针对按键读取而优化的结构.但是,添加新商品需要额外付费.所以,如果你会按键阅读很多并且不经常添加新项目那么就是这样.但说实话 – 你可能根本不应该打扰.如果数据量不够大,您将看不到差异.

点赞