2012-01-25 31 views
2

我寫一個函數,像這樣我在哪裏除其他事項外排序模型數據的簽名:傳遞一個字段的功能排序在該領域

public MyModel GetModel(IQueryable<Something> query, string sort, 
    int page, int PageSize) 
{ 
    ... 
    viewModel.Something = query.OrderByDescending(o => sort) 
      .Skip((page - 1) * pageSize).Take(pageSize).ToList(); 
    ... 
} 

問題是我想在傳遞默認排序參數,這是我想排序,如果參數「排序」爲空或空。例如,這可能是:

.OrderByDescending(o => o.AddedDate); 

我已經嘗試了各種各樣的事情(例如傳遞函數求)的東西傳遞給這個函數來告訴它使用AddedDate或不管我選擇對記錄進行排序如果排序爲空,但沒有任何工作。我將如何實現這樣的事情?

+0

【動態LINQ排序依據]的可能重複(http://stackoverflow.com/questions/41244/dynamic-linq-orderby) – Eranga

回答

3

您的當前代碼沒有太大意義 - 如果您希望能夠通過Something類中的任何字符串屬性進行排序,您將按單個值進行排序,而不是您要排序的項目的屬性。適當的將是:

public MyModel GetModel(IQueryable<Something> query, Func<Something, string> sort, 
    int page, int PageSize) 
{ 
    Func<Something, string> actualSort = sort ?? (o => o.AddedDate); 
    ... 
    viewModel.Something = query.OrderByDescending(actualSort) 
      .Skip((page - 1) * pageSize).Take(pageSize).ToList(); 
    ... 
} 

現在,如果你在null傳爲sort排序將AddedDate恢復到默認的排序順序。

+1

我覺得OP希望能夠在運行時動態選擇排序鍵,所以在這種情況下Func不起作用... –

+0

@ThomasLevesque:我不是這樣讀的,但當然我可能會錯 - 直到OP可以澄清。 – BrokenGlass

+0

@Thomas - 這正是我想要做的。 –

1

最好的選擇是使用Dynamic Linq。它可以讓你通過排序鍵作爲字符串:

query.OrderByDescending(sort)... 
+0

你能給我更多關於如何做到這一點的信息嗎? –

+0

將Visual Studio示例中的DynamicQuery.cs文件複製到您的項目中,在您的代碼中添加'using System.Linq.Dynamic;',並且您可以輕鬆前往;你會在我搜索到的intellisense –

+0

中看到新的OrderBy重載,我沒有在我的計算機上使用DynamicQuery,即使我這樣做了,也不知道它將如何提供幫助。 –