我是新手,并且计划在我的新项目中使用它。阅读之后,看起来我唯一可能遇到的问题是ConcurrentDictionary。
Dapper缓存有关它运行的每个查询的信息,这允许它实现对象 快速并快速处理参数。目前的实施 将此信息缓存在ConcurrentDictionary对象中。对象 它的商店永远不会被冲洗。如果要生成SQL字符串 没有使用参数飞行你可能会打到内存 的问题。我们可以将字典转换为LRU缓存。
如何避免此问题?有人可以告诉我一些代码告诉我如何以及何时冲洗它?
答案 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将基于这些独特的排列进行缓存,并且考虑到更复杂的场景,很容易看出你将如何最终得到很多不同的东西排列,所有这些都需要独立缓存。