2014-01-28 11 views

回答

4

你可以嘗試這樣的事:

IQueryable<Foo> result = source ... 
if(....) 
    result = result.OrderBy(x => x.Id); 
else 
    result = result.OrderBy(x => x.Name); 
6

你可以做一些事情,就幾乎完全映射到你在做什麼,但更容易的選擇是保持查詢的軌道,而不是方法順序:

IQueryable<Whatever> query = someQuery; 

if(something) 
    query = query.OrderBy(item => item.Id); 
else 
    query = query.OrderBy(item => item.Name); 

但是,如果你真的想:

Expression<Func<Whatever, object>> selector = null; 

if(something) 
    selector = item => item.Id; 
else 
    selector = item => item.Name; 

var results = query.OrderBy(selector); 
+1

值得指出的是,第二個選項只適用於Linq-to-Objects。 –

+0

@ p.s.w.g您只需將其更改爲「Expression >」即可處理該問題。 – Servy

+0

我認爲,但仍然可能需要確保每個表達式都具有相同的類型。我不認爲'Expression >'會起作用。 –

0

爲什麼不只是做你的合作nditional邏輯並根據條件執行單獨的OrderBy()?

Ex。

if(foo == true) 
{ 
result = result.OrderBy(r => r.Id); 
} 
else 
{ 
result = result.OrderBy(r => r.Name); 
} 
相關問題