如何使用扩展表达式参数



如何使用这个扩展?

public static IQueryable<TSource> MyOrderByType<TSource>(this IQueryable<TSource> source, bool condition, Expression<Func<TSource, string>> predicate)
{
    return condition ? source.OrderBy(predicate) : source.OrderByDescending(predicate);
}

我是这样用的:

using (var ctx = new MyEntities())
{
    result = ctx.Users
       .MyOrderByType(sortType,p=>sortKey)
        .ToList();                
}
搜索方法:

 public List<User> Search(string name, string sortKey, bool sortType)
{
    List<User> result;
     using (var ctx = new MyEntities())
            {
                result = ctx.Users
.where(u => u.name.contains(name))
.MyOrderByType(sortType, p => sortKey)
}
}
.ToList();
            }
            return result;
}

后面的代码:

 bool sortType=ddlSortType.SelectedValue=="0"?true:false;
string sortKey=ddlSortKey.SelectedValue;
var lstUser = userService.Search(txtName.Text,sortType,sortKey);

但是它不排序结果

怎么了?

因为您没有正确传递谓词。在调用MyOrderByType扩展时,通常选择要按User的哪个字段排序。使用您的sortKey字符串创建一个适当的谓词。我处理了一些案例来解析姓名和电子邮件的表达式,您可以轻松地添加另一个字段来排序。

var sortKey = "name"; // use your sortKey
Expression<Func<User, string>> sortExpression;
switch (sortKey)
{
    case "email":
        sortExpression = x => x.Email;
        break;
    case "name":
        sortExpression = x => x.Name;
        break;
    default:
        sortExpression = x => x.Name;
        break;
}
using (var ctx = new MyEntities())
{
    result = ctx.Users
       .MyOrderByType(sortType, sortExpression)
       .ToList();                
}
// defined below
public class User
{
    public string Name {get;set;}
    public string Email {get;set;}
    // other properties
}
public class MyEntities : DbContext 
{ 
    public DbSet<User> Users { get; set; }
}

最新更新