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

时间:2014-10-23 13:36:13

标签: c# linq dapper

我们正在调查使用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'?

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

/埃里克

2 个答案:

答案 0 :(得分:2)

conn.Query("...")

返回IEnumerable<dynamic>。但是,“动态LINQ”会提前dynamic,并且可能没有人更新它以使用dynamic;它肯定可以完成,但它是工作(并不是微不足道的)。选项:

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

答案 1 :(得分:0)

我怀疑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