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<TheActualType
。
【讨论】:
但我们不想将“AMOUNT > 0”下推到 SQL 服务器。我们想在“内存中”的结果集合上执行它 第二个问题是我们没有“ActualType”。这是一个报告解决方案,它将查询许多不同的数据源。有时结果将是 5 列,有时是 20 列。并且具有不同数量的维度和度量。所以我们必须使用“动态集合”,即我们不能将它转换成某种固定的结构。 (感谢您的回复,感谢) @user2512533,是的,我明白了。使用我给出的 ToList() 或 ToAnonymousList(),看看它们是否有效。以上是关于Dapper 动态集合上的动态 Linq - 可能吗?的主要内容,如果未能解决你的问题,请参考以下文章
动态 Json - 无法访问 Newtonsoft.Json.Linq.JValue 上的子值