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

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

在使用 IQueryable 之前,我使用字典来存储 FK 关系,因此为了模仿上面的代码,我从预先存在的列表中编写以下代码<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 感兴趣<T>.

有帮助吗?

解决方案

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top