IQueryable与Dictionary的表现

时间:2011-05-16 06:46:31

标签: linq performance dictionary subsonic3 iqueryable

我在启动时在我的应用中缓存了大量静态元数据。它来自数据库,有很多外键关系。我正在研究建模它们的最佳方式。 我刚刚开始使用LINQ。

我很容易申报一个班级

public class AllData {
    public static IQueryable<libm_ColPurpose> IQ_libm_ColPurpose = libm_ColPurpose.All();
    public static IQueryable<libm_ColType> IQ_libm_ColType = libm_ColType.All();
...

(我正在使用SubSonic 3来生成我的课程,但这不是重点)。 然后我可以使用IQueryable <T&gt;成员可以访问我想要的任何内容,例如:

libm_ColType ct = AllData.IQ_libm_ColType.SingleOrDefault(x => x.ColTypeStr == this.DefaultJetColTypeStr);

在使用IQueryable之前,我使用Dictionaries来存储FK关系,所以为了模仿上面的代码,我将从预先存在的List <libm_ColType&gt;中编写以下代码。列表

Dictionary<string, libm_ColType> colTypeByColTypeStr = new Dictionary<string, libm_ColType>();
foreach (libm_ColType x in list) { rtn.Add(x.ColTypeStr, x); }

然后我可以使用

libm_ColType ct = colTypeByColTypeStr[this.DefaultJetColTypeStr];

好的,最后我们回答了问题!

通过ID进行字典查找非常有效,但IQueryable解决方案更加灵活和优雅。

我想知道我将使用IQueryable获得多少性能。我怀疑每次调用它时都会对列表进行线性扫描,如果涉及到大量记录,那么这将会重复调用。 如果我能识别出唯一值列并在第一次查找后生成并缓存哈希表,那将会很棒,但我怀疑这不会成为产品的一部分。

对于我来说,这对使用LINQ来说有点破坏性。

注意(我将再次重复)我不是从数据库中提取数据,它已经在内存中并且我在那里查询它,所以我只对查找内存中的IQueryable感兴趣{ {1}}&GT;

1 个答案:

答案 0 :(得分:0)

IQueryable表示数据存储中的集合,因此您可能在内存中拥有集合。如果你明确想要内存中的集合,那么我会回到你的字典。请记住,这并不妨碍您对数据使用LINQ查询。