简体   繁体   English

如何使用带有表达式参数的扩展名?

[英]How to use extension with expression parameter?

How can I use this extension? 如何使用此扩展程序?

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);
}

I used it this way: 我用这种方式:

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

search method: 搜索方法:

 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;
}

in code behind: 在后面的代码中:

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

but it doesn't sort the result. 但它不会对结果进行排序。

What is wrong? 怎么了?

Because you didn't pass the predicate correctly. 因为您没有正确传递谓词。 When calling your MyOrderByType extensions, you typically choose which field of User you want to sort by. 调用MyOrderByType扩展名时,通常会选择要作为排序依据的User字段。 Use your sortKey string to create a proper predicate. 使用您的sortKey字符串创建正确的谓词。 I handled cases to resolve an expression for name and email, you can easily add another fields to sort by. 我处理过案例来解析姓名和电子邮件的表达式,您可以轻松添加其他字段进行排序。

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; }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM