c# - 使用字符串的动态 IQueryable 顺序

标签 c# .net dynamic expression iqueryable

<分区>

Possible Duplicate:
Dynamic LINQ OrderBy

我正在尝试为 Iqueryable 创建一个动态排序。
所以在下面你可以看到我正在关注我在 stackoverflow 中看到的一些示例。

 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)

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)

最佳答案

问题在这里:-

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

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

您需要构建自己的表达式树,该表达式树可以转换为 SQL。表达式 API 非常复杂,如果你想真正掌握它,你需要做大量的阅读。 Here's a good starting point on creating dynamic queries using the expression API for you .

值得庆幸的是,您的具体案例相当简单,并且有可用的示例 here , here , 和 here ,但我确实建议您对其进行一些阅读以了解发生了什么。如果您只是复制粘贴,那么您或其他人最终将不得不维护它并度过一段非常难过的时光。

关于c# - 使用字符串的动态 IQueryable 顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13252206/

相关文章:

c# - ListBox.SelectedIndex = -1 未取消设置所选项目

c# - WCF 在没有容器的情况下序列化数组或集合

c# - XAML 和 MySQL 数据库访问

java - java中动态实例化对象

c# - Rust 中 fn 参数的协方差使用什么?

c# - ASP.NET Core 如何执行 Linux shell 命令?

c# - 如何从这个定时器的回调函数中更改 System.Threading.Timer 中的间隔时间?

c# - 如何在 C# 中动态重命名 excel 工作表名称

sql - 将TABLE变量传递给sp_executesql

Linq To Sql - 动态排序 - Case When