【问题标题】:Performance of IQueryable versus DictionaryIQueryable 与 Dictionary 的性能
【发布时间】:2011-05-16 06:46:30
【问题描述】:

我在启动时在我的应用程序中缓存了一大堆静态元数据。它来自数据库,并且有大量的外键关系。我正在研究建模它们的最佳方法。 我刚开始使用 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&lt;T> 成员来访问我想要的任何东西,例如:

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

在使用 IQueryable 之前,我使用字典来存储 FK 关系,因此为了模仿上面的代码,我将从预先存在的 List&lt;libm_ColType> 列表中编写以下代码

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@ 感兴趣987654327@>.

【问题讨论】:

  • 天哪,在查看了 LINQ-to-Object Q 之后,我想知道我是否真的已经将数据库中的所有数据加载到 IQueryable 中,或者我刚刚设置了当我引用它们时,会收集大量的单个数据库检索。我是 LINQ 的新手!也许我应该坚持我输入的列表!

标签: linq performance dictionary subsonic3 iqueryable


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-11-24
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多