我正在构建一个小型搜索类,它使用谓词构建器来获得一些结果:
这是我的查询:
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);
结果成为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表达式传递给另一个函数。
任何人都知道我做错了什么?谢谢!
答案 0 :(得分:1)
OrderBy
需要Expression<Func<TSource, TResult>>
类型的表达式。在您的代码中,TSource
为SearchResult
,TResult
为IComparable
,无法转换为数据库查询。你希望TResult
是一个原始类型等于timeAdded
的具体类型,(给定名称,我认为它是DateTime
?),以便它可以工作。
Expression<Func<SearchResult, DateTime>> OrderByExpression = x => x.User.timeAdded;
var sortedResult = results.OrderBy(OrderByExpression);
答案 1 :(得分:0)
你有没有尝试过(现在无法访问VS,所以更多的是猜测):
Func<SearchResult, IComparable> OrderByFunc = x => x.User.timeAdded;
var sortedResult = results.OrderBy(OrderByFunc);