我想将两个不同的排序表达式存储到列表中,然后想要使用orderBy linq执行它。
我有以下代码。
class Product
{
public int Id { get; set; }
public String Name {get; set;}
}
List<?> GetSortExpressions() {
Expression<Func<Product, int>> idSortExpression= p => p.Id;
Expression<Func<Product, String>> nameSortExpression = p => p.Name;
List<?> sorts = new List<?>();
sorts.Add(idSortExpression);
sorts.Add(nameSortExpression );
return sorts;
}
然后我想在IQueryable对象上执行排序列表,如下所示。
IQueryable<T> ApplySortExpressions(IQueryable<T> data, List<?> sorts) {
for(int i=0;i < sorts.Count; i++) {
if(i == 0) {
data = data.OrderBy(sorts[i]);
} else {
data = ((IOrderedQueryable<T>)data).ThenBy(sorts[i]);
}
}
return data;
}
由于类型错误,我无法将表达式添加到列表中。你能否在下面给我一个正确的列表通用类型?
List<?> sorts = new List<?>();
提前致谢。
答案 0 :(得分:0)
您可以列出类型&#34; Expression&#34;然后你应该能够将两个表达式存储在同一个列表中,但是你必须在ApplySortExpressions方法中将表达式转换回它们所需的类型,否则你不能在OrderBy或ThenBy方法中使用它们
答案 1 :(得分:0)
您可以将它们存储为Expression<Func<Product, object>>>
。然后你的功能变成:
List<Expression<Func<Product, object>>> GetSortExpressions() {
Expression<Func<Product, object>> idSortExpression = p => p.Id;
Expression<Func<Product, object>> nameSortExpression = p => p.Name;
var sorts = new List<Expression<Func<Product, object>>>();
sorts.Add(idSortExpression);
sorts.Add(nameSortExpression);
return sorts;
}
和
IQueryable<T> ApplySortExpressions<T>(IQueryable<T> data, List<Expression<Func<T, object>>> sorts) {
for (int i = 0; i < sorts.Count; i++) {
if (i == 0) {
data = data.OrderBy(sorts[i]);
}
else {
data = ((IOrderedQueryable<T>) data).ThenBy(sorts[i]);
}
}
return data;
}