2014-09-26 70 views
2

我使用動態LINQ和今天我想建立一個稍微複雜的嵌套查詢:如何在動態Linq查詢中嵌套OrderBy?

"Composition 
.Where(((ExpirationDate > DateTime.UtcNow.Date) && (ExpirationDate.Year != 9999))) 
.OrderBy(\"ExpirationDate ASC\") 
.Select(ExpirationDate) 
.FirstOrDefault() == @0" 

(休息時間只有那裏可讀性在這個崗位,不是真的存在在代碼)

該查詢由一個字符串變量保存並傳遞給此:

private static Func<IQueryable<T>, object, IQueryable<T>> CreateWhereExpression<T>(string whereClause) where T : class 
{ 
    return (q, o) => q.Where(whereClause, o); 
} 

它愉快地創建Where表達式。 (請注意,whereClause包含上面的確切字符串「Composition.Where ......」) 但只要它的時間來執行,它會抱怨:

沒有適用的骨料方法「排序依據」存在

所以我的問題是,我做錯了什麼?我怎樣才能讓嵌套的OrderBy工作?

+0

你是不是想解析'LINQ'?動態LINQ不支持解析自己的語法。 – 2014-09-26 06:42:09

+0

是的,我試圖讓Dynamic Linq將該字符串解析爲Linq查詢。我也試過用Linq語法'.OrderBy(ExpirationDate)',但我得到了同樣的錯誤。我試圖完成這樣的事情相似:http://stackoverflow.com/questions/10314708/how-to-build-a-nested-query-with-the-dynamic-linq-library但與orderby查詢。 – Vincent 2014-09-26 06:54:02

回答

3

默認情況下DynamicLinq支持嵌套查詢一個小功能IEnumerable領域,採取一切它inteface IEnumerableSignatures定義如下WhereAnyCount和等,但沒有OrderbySelectFirstOrDefault你所需要的。
所以,你可以把它像

interface IEnumerableSignatures 
{ 
    .... 
    void OrderBy(object selector); 
    void Select(object selector); 
    void FirstOrDefault(); 
} 

後添加到該接口,你需要修復ParseAggregate方法這樣

Expression ParseAggregate(Expression instance, Type elementType, string methodName, int errorPos) 
{ 
    .... 
    if (signature.Name == "Min" || signature.Name == "Max" 
     || signature.Name == "OrderBy" || signature.Name == "Select" //add this for support OrderBy and Select that need two generic parameters 
    ) 
    .... 
} 

最後一個查詢將是工作

"Composition 
.Where((ExpirationDate > DateTime.UtcNow.Date) && (ExpirationDate.Year != 9999)) 
.OrderBy(ExpirationDate) 
.Select(ExpirationDate) 
.FirstOrDefault() == @0" 
+0

+1。我使用的DynamicLinq版本是從Nuget中消失的,我不得不使用基本版本,這顯然缺少了這個功能。謝謝! – John 2016-11-04 13:20:43