2015-08-03 49 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