Dapper 动态集合上的动态 Linq - 可能吗?

Posted

技术标签:

【中文标题】Dapper 动态集合上的动态 Linq - 可能吗?【英文标题】:Dynamic Linq on Dapper dynamic collections - possible? 【发布时间】:2014-10-23 13:36:13 【问题描述】:

我们正在研究使用 LinQ 查询 Dapper 创建的内部动态集合。问题是:

如何使用 Scott Guthrie 动态 linq(或其他技术,如果可能)对集合执行动态 LinQ? (http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library)

这就是我们想要做的(非常简化):

使用 Dapper 返回一个动态集合(这里称为行):

rows = conn.Query(“select ACCOUNT, UNIT, AMOUNT from myTable”);

如果我们使用“静态”LinQ 查询就没有问题。所以这很好用:

var result = rows.Where(w => w.AMOUNT > 0);

但我们想使用动态 Linq 编写类似的东西:

var result = rows.Where("AMOUNT > 0");

但我们无法让它发挥作用。

我们得到的错误是:

“对象”类型中不存在属性或字段“AMOUNT”

(我们也尝试了很多其他语法 - 但无法让它发挥作用)

请注意:我们希望在 Dapper 从数据库请求数据时使用动态 SQL(这很容易)。我们想在 Dapper 查询返回的集合上执行许多小的动态 Linq 语句。

难道 ScottGu 动态 Linq 只适用于“LinQ to SQL”?

是否有其他替代方法可以实现相同的目标? (性能是关键问题)

/埃里克

【问题讨论】:

【参考方案1】:
conn.Query("...")

返回IEnumerable<dynamic>。然而,“动态 LINQ”早于 dynamic,大概没有人更新它以使用 dynamic;它当然可以完成,但它是工作(而且不是微不足道的)。选项:

对于某些T,使用Query<T> 对“动态 LINQ”进行必要的更改,并最好将这些更改提供给更广泛的社区

【讨论】:

【参考方案2】:

我怀疑conn.Query(“select ACCOUNT, UNIT, AMOUNT from myTable”); 返回IEnumerable<object>。为了使 Dlinq 工作,您需要拥有IEnumerable<TheActualType>

你可以试试这个:

conn.Query<dynamic>("yourQueryString")
   .ToList()
 //.ToAnonymousList()
   .Where("AMOUNT > 0"); 

如果这不起作用,您可以尝试使用ToAnonymousList,它会尝试返回IList&lt;TheActualType

【讨论】:

但我们不想将“AMOUNT > 0”下推到 SQL 服务器。我们想在“内存中”的结果集合上执行它 第二个问题是我们没有“ActualType”。这是一个报告解决方案,它将查询许多不同的数据源。有时结果将是 5 列,有时是 20 列。并且具有不同数量的维度和度量。所以我们必须使用“动态集合”,即我们不能将它转换成某种固定的结构。 (感谢您的回复,感谢) @user2512533,是的,我明白了。使用我给出的 ToList() 或 ToAnonymousList(),看看它们是否有效。

以上是关于Dapper 动态集合上的动态 Linq - 可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

动态 Json - 无法访问 Newtonsoft.Json.Linq.JValue 上的子值

C# - 多个属性上的动态 Linq 左外连接

使用dapper时动态拼接查询sql有啥好的方法吗

从字符串构建动态LINQ查询 - 使用Reflection?

Dapper 传递动态参数

如何让 Dapper 动态不区分大小写?