【问题标题】:Dynamic Linq on Dapper dynamic collections - possible?Dapper 动态集合上的动态 Linq - 可能吗?
【发布时间】: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”?

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

/埃里克

【问题讨论】:

    标签: c# linq dapper


    【解决方案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(),看看它们是否有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2021-10-11
      • 2013-03-14
      • 1970-01-01
      相关资源
      最近更新 更多