1

我正在尝试使用 system.dynamic.linq 创建动态排序。

这是我使用的查询:

var query = dalSession.Query<T>().AsQueryable();
var res = (from x in query orderby "x.FirstName" select x)

这是mysql的输出:

select
     affiliate0_.id as id0_,
     affiliate0_.first_name as first6_0_,
from affiliate affiliate0_ order by 'x.FirstName' //FirstName as well

所以你可以看到mysql查询的输出是直接字符串,而不是它的反射,('x.FirstName')或('FirstName')。
这在 mysql 上下文中没有任何意义,看起来我需要 order by affiliate0_.first_name
无论如何要向 Nhibernate 提供成员本身吗?那么编译后的查询会正常完成吗?

4

4 回答 4

0

您必须从您的要求中删除 "。"x.FirstName" 被视为一个字符串并被转换为一个 sql 字符串。

于 2012-11-07T08:46:45.117 回答
0

您是否按照以下方式尝试过(如 Diego 建议的那样)? (from x in query select x).OrderBy("FirstName")

因为我觉得你使用的时候动态linq orderby扩展方法没有执行(x => "FirstName")

否则试试这个: (from x in query select x).OrderBy("it.FirstName")

顺便说一句,我将 Dynamic.cs 中的 OrderBy 方法重命名为 DynamicOrderBy 因为在某些情况下也执行了非动态 linq OrderBy 方法:

public static IQueryable<T> DynamicOrderBy<T>(this IQueryable<T> source, string ordering, params object[] values)并改用那个:

(from x in query select x).DynamicOrderBy("FirstName")

于 2012-11-08T06:47:44.110 回答
0

“x”在动态字符串中没有任何意义。

删除x.(即只留下“名字”),它应该可以工作。

使用方法调用而不是查询理解语法,您将获得:

var res = query.Orderby("FirstName")
于 2012-11-07T17:41:08.717 回答
0
var param = Expression.Parameter("x");
var prop = Expression.Property(param, "FirstName");
var lambda = Expression.Lambda<Func<User, string>>(prop, param);
query.Orderby(lambda);
于 2013-03-13T09:28:51.217 回答