【发布时间】: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<T> 成员来访问我想要的任何东西,例如:
libm_ColType ct = AllData.IQ_libm_ColType.SingleOrDefault(x => x.ColTypeStr == this.DefaultJetColTypeStr);
在使用 IQueryable 之前,我使用字典来存储 FK 关系,因此为了模仿上面的代码,我将从预先存在的 List<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