【问题标题】:LINQ sorting: Cannot order by type 'System.IComparable'LINQ 排序:无法按类型“System.IComparable”排序
【发布时间】:2010-11-13 18:51:49
【问题描述】:

我正在构建一个小型搜索类,它使用谓词构建器来获取一些结果:

这是我的查询:

var results = (from u in db.users
               join p in db.profiles on u.userId equals p.UserID
               select new SearchResult { Profile = p, User = u }).AsQueryable().Where(predicate);

Results 成为 SearchResult 的可枚举:

public class SearchResult 
{
    public user User { get; set; }
    public profile Profile { get; set; }
}

这很好,但现在我也想对其进行排序:

var sortedResult = results.OrderBy(x => x.User.timeAdded);

这也很好,除非我这样做:

Expression<Func<SearchResult, IComparable>> OrderByExpression = x => x.User.timeAdded;
var sortedResult = results.OrderBy(OrderByExpression);

我收到此错误:无法按类型“System.IComparable”订购。

这与将 lambda 查询直接放入 orderby 子句(有效)不完全相同吗?我这样做的原因是我想将 orderby 表达式传递给另一个函数。

谁知道我做错了什么?谢谢!

【问题讨论】:

  • 请展示 OrderByExpression 的实现

标签: c# linq lambda sql-order-by expression


【解决方案1】:

OrderBy 需要 Expression&lt;Func&lt;TSource, TResult&gt;&gt; 类型的表达式。在您的代码中,TSourceSearchResultTResultIComparable,不能转换为数据库查询。您希望TResult 是一个原始类型,等于timeAdded 的具体类型,(给定名称,我假设它是DateTime?)这样才能工作。

Expression<Func<SearchResult, DateTime>> OrderByExpression = x => x.User.timeAdded;
var sortedResult = results.OrderBy(OrderByExpression);

【讨论】:

    【解决方案2】:

    你试过了吗(目前无法访问 VS,所以更多的是猜测):

    Func<SearchResult, IComparable> OrderByFunc = x => x.User.timeAdded;
    var sortedResult = results.OrderBy(OrderByFunc);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-08
      • 2015-11-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多