2015-08-03 56 views
0

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

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

但它不会对结果进行分类。

有什么不对?

+0

由于缺乏错过的信息MyEntities'如何'看起来像什么'sortKey'是的,这只是胡乱猜测:我认为这是没有错的扩展方法,但我想'sortKey'是不是一个简单的“钥匙”,而是一个复杂的钥匙。所以请提供更多有关您设置的上下文信息。并请提供完整的编译示例。 – ckruczek

+0

请注意,'Queryable.OrderBy'返回'IOrderedQueryable',而不是'IQueryable'。如果你想实现'ThenBy'等,你可能也想这样做。 –

回答

0

因为您没有正确传递谓词。当拨打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; } 
} 
+0

我已经更新了答案。对,它可以是用户的任何属性,所以扩展方法将按照你想要的任何用户字段进行排序。 – myroman

+0

对不起,我不明白你,请详细说明一下? – myroman

+0

再看看我的例子,答案就在那里。您的扩展方法不必知道您将传递给它的sortKey,它可以是User的任何属性。它的目的仅仅是按照升序或降序对一些字段的用户集合进行排序。要选择属性,您需要编写lambda表达式'x => x.Name'或者'x => x.Email'。但是当你调用MyOrderByType方法时,它应该知道你想要排序哪个属性:'ctx.Users.MyOrderByType(sortType,x => x.Email)'。 – myroman