2013-10-22 22 views
1

我想獲得以下功能。但是因爲我必須返回不同的數據類型,所以這個方法是不允許的。我會在這方面做什麼?如何在lambda表達式中返回不同的數據類型?

.OrderBy(X => 
      { 
       switch (OrderByColumn) 
       { 
        case "": 
         return X.a.CreatedOn; 
        case "BookCategoryName": 
         return X.a.BookCategoryName; 
        case "BookCategoryDescription": 
         return X.a.BookCategoryDescription; 
       } 
       return X.a.CreatedOn; 
      }); 

或者其他任何建議獲得此功能?

回答

3

我建議你改變你的邏輯來構建查詢,而不是在拉姆達作出這樣的邏輯:在結束

var query = list.Where(...); 

if(OrderByColumn=="BookCategoryName") 
{ 
    query = query.OrderBy(x=>x.a.BookCategoryName); 
} 
.... 

var result = query.ToList(); //for e.g. 

之前像

構建查詢將工作,因爲你想和看起來更清潔

+1

一個更正:'query = query.OrderBy ...' –

+0

@EliArbel當然,謝謝:) – wudzik

1

對於每個數據類型,你curr ent lambda可能會返回,使用一個單獨的塊來定義排序,對於不使用該返回類型的任何選項,返回一個常量。

猜測,就目前而言,這CreatedOn是一個DateTimeBookCategoryNameBookCategoryDescription是字符串,它會是這樣的:

.OrderBy(X => 
      { 
       switch (OrderByColumn) 
       { 
        case "": 
         return X.a.CreatedOn; 
        case "BookCategoryName": 
         return new DateTime(1900,1,1); 
        case "BookCategoryDescription": 
         return new DateTime(1900,1,1); 
       } 
       return X.a.CreatedOn; 
      }) 
.ThenBy(X => 
      { 
       switch (OrderByColumn) 
       { 
        case "": 
         return ""; 
        case "BookCategoryName": 
         return X.a.BookCategoryName; 
        case "BookCategoryDescription": 
         return X.a.BookCategoryDescription; 
       } 
       return ""; 
      }); 

(當然,恆值可以搬出來是實常數或變量等,但我想使包含上面的代碼中個體經營)

1

,另一種選擇是排序字段選擇自己解壓縮到一個單獨的方法,這樣的:

public IEnumerable<Data> SelectData(IEnumerable<Data> data, Func<Data, bool> predicate) 
{ 
    return data 
     .Where(predicate) 
     .OrderBy(GetCurrentOrderingField); 
} 

private IComparable GetCurrentOrderingField(Data x) 
{ 
    switch (OrderByColumn) 
    { 
     case "BookCategoryName": 
      return x.a.BookCategoryName; 

     case "BookCategoryDescription": 
      return x.a.BookCategoryDescription; 
    } 

    return x.a.CreatedOn; 
} 

這當然,對於實現IComparable接口的字段。

相關問題