2010-07-20 17 views
2

所以,這個問題的上下文是非常具體的,但我認爲有一個普遍的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(不需要解析任何東西),但我不希望這樣做。

還有其他想法嗎?謝謝!

回答

1

可能是因爲其優先考慮 到非擴展方法

這是正確的假設,一個類的實例的方法給出了一個擴展方法的偏好。你也已經診斷出可能的解決方法。另一種選擇是直接調用擴展方法(因爲它只是靜態類中的一個方法)。

1

如果您想要更清晰的解決方案,您可以將其稱爲靜態方法而不是擴展方法。

IQueryable<People> query = DynamicLinqHelperClass 
    .OrderBy(_db.People, sortExpression) 
    .Skip(startingRowIndex) 
    .Take(maximumRows)