dapper.net,如何刷新ConcurrentDictionary?

时间:2012-05-04 19:19:19

标签: dapper concurrentdictionary

我是新手,并且计划在我的新项目中使用它。阅读之后,看起来我唯一可能遇到的问题是ConcurrentDictionary。

  

Dapper缓存有关它运行的每个查询的信息,这允许它实现对象   快速并快速处理参数。目前的实施   将此信息缓存在ConcurrentDictionary对象中。对象   它的商店永远不会被冲洗。如果要生成SQL字符串   没有使用参数飞行你可能会打到内存   的问题。我们可以将字典转换为LRU缓存。

如何避免此问题?有人可以告诉我一些代码告诉我如何以及何时冲洗它?

1 个答案:

答案 0 :(得分:2)

根据上面的评论,这是一个即时的例子:

var builder = new StringBuilder();
builder.AppendLine("SELECT Foo FROM Bar");
if (fisrtName != null || lastName != null)
    builder.AppendLine("WHERE");
if (firstName != null)
    builder.AppendLine("    Bar.FirstName = @Firstname");
if (firstName != null && lastName != null)
    builder.Append(" AND");
if (lastName != null)
    builder.AppendLine("    Bar.LastName = @LastName");
var sql = builder.ToString();

如您所见,dapper现在运行的实际SQL将根据firstName和/或lastName是否为空而有所不同。如果两者都为null,则会得到一个SQL字符串。如果只有firstName不为空,则会得到另一个。如果只有lastName不为空,那么您将获得另一个。最后,如果两者都不为null,则会得到第四个排列。

这就是“即时”的含义 - dapper将基于这些独特的排列进行缓存,并且考虑到更复杂的场景,很容易看出你将如何最终得到很多不同的东西排列,所有这些都需要独立缓存。