所以,這個問題的上下文是非常具體的,但我認爲有一個普遍的C#問題掙扎出去。 :)LINQ查詢方法之間的解決方法重載
我有一個ASP.NET Web窗體頁面與綁定到ObjectDataSource的GridView控件。數據源控件掛接到數據訪問類,而該類又使用LINQ來查詢Entity Framework v4。數據訪問類中的方法具有排序/分頁參數,因此我可以使用GridView/ObjectDataSource控件的內置功能。下面是一個例子:
public IList<Person> GetAllPaged (
string sortExpression,
int startingRowIndex,
int maximumRows)
{
return _db.People
.OrderBy(!string.IsNullOrWhiteSpace(sortExpression) ? sortExpression : "Id")
.Skip(startingRowIndex)
.Take(maximumRows)
.ToList();
}
因爲由GridView控件傳遞給此方法的排序表達式是一個字符串,在調用排序依據需要是動態的。爲此,我使用了漂亮的Microsoft dynamic LINQ helper classes。
的問題是,排序依據,現在這裏過載,並且兩個重載具有有效相同的簽名:
ObjectQuery<T> OrderBy(string keys, params ObjectParameter[] parameters)
(從System.Data.Entity的)
IQueryable OrderBy(this IQueryable source, string ordering, params object[] values)
(從動態LINQ助手類)
C#編譯器解析爲第一個方法(或者因爲它優先考慮非擴展方法,或者因爲第一個方法是o N A類與接口,或者我沒有想到的)一些其他的解決邏輯,這不工作:
EntitySqlException:「ID」不能 解決當前範圍或 上下文。
是否有任何方法來指定哪個重載的方法被調用(可能通過類似於C++的::
解析運算符)?
我知道我能做到這一點:
return _db.People
.AsQueryable()
.OrderBy(!string.IsNullOrWhiteSpace(sortExpression) ? sortExpression : "Id")
.Skip(startingRowIndex)
.Take(maximumRows)
.ToList();
但是uglifies我的數據訪問方法有點。 :)我也可以進入動態LINQ代碼並將OrderBy重命名爲OrderByDynamic(不需要解析任何東西),但我不希望這樣做。
還有其他想法嗎?謝謝!