【问题标题】:Dynamic IQueryable order by using string [duplicate]使用字符串的动态 IQueryable 订单 [重复]
【发布时间】:2012-11-06 13:36:33
【问题描述】:

可能重复:
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)

【问题讨论】:

标签: c# .net dynamic expression iqueryable


【解决方案1】:

问题出在这里:-

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.

谢天谢地,您的具体案例相当简单,并且有 hereherehere 的工作示例,但我真的这样做建议阅读它以了解其内容继续。如果您只是复制粘贴,那么您或其他人最终将不得不维护它并度过一段非常难过的时光。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果你想在内存中进行排序,你可以使用 .ToList()
    猜你喜欢
    • 2019-08-20
    • 2019-11-09
    • 2019-12-26
    • 1970-01-01
    • 2019-04-19
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    相关资源
    最近更新 更多