我在启动时在我的应用中缓存了大量静态元数据。它来自数据库,有很多外键关系。我正在研究建模它们的最佳方式。 我刚刚开始使用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;
答案 0 :(得分:0)
IQueryable表示数据存储中的集合,因此您可能不在内存中拥有集合。如果你明确想要内存中的集合,那么我会回到你的字典。请记住,这并不妨碍您对数据使用LINQ查询。