通过相等性缓存LINQ表达式

12 浏览
0 Comments

通过相等性缓存LINQ表达式

考虑以下情况。

您有一个允许对其进行特定调用的存储库。这些调用使用LINQ,并且在返回的数据量方面可能相对昂贵。

考虑到在我的情况下,如果数据过时并不是特别糟糕,可以实现一个缓存,以便大型和昂贵的查询不需要在每次调用时执行。嘿,我们甚至可以根据时间或使用情况实现一些缓存策略来确定何时再次执行该查询。

我试图弄明白的问题是如何在缓存中对其进行键控。一种方法是简单地说:

"查询类型1" = 特定的LINQ表达式
"查询类型2" = 特定的LINQ表达式

然后,将缓存键控为一个简单的字符串。但是,考虑到我们在使用LINQ,我们是否可以通过LINQ表达式本身来对缓存进行键控呢?我理解这对性能有影响,但是否有办法比较两个LINQ表达式是否相同?

0
0 Comments

缓存LINQ表达式的原因是为了提高性能,避免重复计算相同的查询结果。解决方法是通过将查询的参数封装成一个Criteria类,并使用该类作为缓存的键值,从而实现根据参数来缓存查询结果。

首先,创建一个Criteria类,该类包含一个Dictionary实例,用于存储参数的键值对。该类还包含一些类型安全的设置和获取方法。

接下来,为Dictionary编写一个扩展方法,该扩展方法基于Stackoverflow上的一个答案。

最后,创建一个实现IEqualityComparer接口的类,用于比较Criteria类型的对象。这样就可以将缓存的键值设为Criteria对象,该对象根据传入的参数进行设置。

通过以上方法,可以将查询结果缓存起来,并根据参数来检查缓存。这种方法还可以扩展到需要根据不同的用户账户进行缓存的情况,只需在Criteria类中添加一个字段来表示用户类型即可。

需要注意的是,如果想将实例作为Dictionary的键值,需要重写Equals和GetHashCode方法,并实现IEqualityComparer<>接口。

0
0 Comments

问题的出现原因:

由于数据集可能非常大,而查询语句本身也会很庞大,导致性能方面的考虑。重新查询的代价非常高,因此想寻找一种方法来缓存LINQ表达式。

解决方法:

一种策略是比较两个IQueryable对象的渲染后的SQL文本和参数是否相同。可以通过检查渲染后的SQL文本和参数来确定它们是否与另一个IQueryable对象的渲染后的SQL文本和参数相同。

可以对键进行哈希处理,并查找冲突。这样可以提高性能并缓存LINQ表达式。

参考链接:Retrieve LINQ to sql statement (IQueryable) WITH parameters

0