关于c#:使用字符串的Dynamic IQueryable顺序

Dynamic IQueryable order by using string

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Dynamic LINQ OrderBy

我正在尝试创建一个对iqueryable的动态排序。下面是我在StackOverflow中看到的一些例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 var query = dalSession.Query<T>();
            var res = (from x in query orderby Extensions.Sort<T>(query,"FirstName") select x).Skip((paging.CurrentPageRecord)).Take(paging.PageSize);


public static class Extensions
{
    public static IQueryable<T> Sort<T>(this IQueryable<T> query,
                                             string sortField)
    {
        return query.OrderByDescending(s => s.GetType()
                                             .GetProperty(sortField));

    }
}

我得到的例外情况是:

System.Linq.IQueryable1[Partners.BusinessObjects.Affiliate] Sort[Affiliate](System.Linq.IQueryable1[Partners.BusinessObjects.Affiliate], System.String)

1
2
3
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NotSupportedException: System.Linq.IQueryable`1[Partners.BusinessObjects.Affiliate] Sort[Affiliate](System.Linq.IQueryable`1[Partners.BusinessObjects.Affiliate], System.String)


问题出在这里:

1
s => s.GetType().GetProperty(sortField)

当您试图访问iqueryable的结果集时,它会被转换为SQL,并针对您的数据库运行查询(而不是在内存中运行)。问题是,显然您的数据库对您的类型一无所知,不能对它们调用任何方法,当然也不能对它们执行任何反射。

您需要构建自己的表达式树,可以将其转换为SQL。表达式API非常复杂,如果您真的想得到它,您需要做大量的阅读。下面是使用表达式API创建动态查询的良好起点。

谢天谢地,您的具体案例相当简单,这里、这里和这里都有一些有用的例子,但我确实建议您阅读一下,了解发生了什么。如果你只是复制粘贴,那么你或其他人最终将不得不保持它,并有一个真正的悲伤的时间。


iain是对的,你的iqueryable只在真正需要的时候才开始提取数据。您可以通过一个简单的技巧来强制加载long dummy=query.count();。这不是完整的解决方案,您希望避免构建查询树的复杂性,因此如果集合不是非常大,只需将其转换为某种可排序类型即可。