2011-09-21 64 views
3

我正在嘗試使用動態Linq(ScottGu發佈的)來做GroupBy(lambda表達式)。我有一個對象。我正在做AsQueryable。這是我有..類型參數不能從使用推斷,任何人都可以幫忙嗎?

var result = Items.AsQueryable().GroupBy("DeliveryDate"); 

但它給了我一個錯誤說,參數不能從使用推斷。我認爲它沒有看到正確的OrderBy。

項目是List<Stock>

我嘗試添加<>到GroupBy但我想我需要通過多個項目。我有點困惑。

我傳入的字段(通過字符串)可以是任何類型,在本例中它是DateTime。

如果我做我的標準LINQ它確實工作。即:

var result = Items.AsQueryable().GroupBy(x => x.DeliveryDate); 

這裏是擴展方法(從ScottGu):

public static IQueryable GroupBy(this IQueryable source, string keySelector, string elementSelector, params object[] values) { 
    if (source == null) throw new ArgumentNullException("source"); 
    if (keySelector == null) throw new ArgumentNullException("keySelector"); 
    if (elementSelector == null) throw new ArgumentNullException("elementSelector"); 
    LambdaExpression keyLambda = DynamicExpression.ParseLambda(source.ElementType, null, keySelector, values); 
    LambdaExpression elementLambda = DynamicExpression.ParseLambda(source.ElementType, null, elementSelector, values); 
    return source.Provider.CreateQuery(
     Expression.Call(
      typeof(Queryable), "GroupBy", 
      new Type[] { source.ElementType, keyLambda.Body.Type, elementLambda.Body.Type }, 
      source.Expression, Expression.Quote(keyLambda), Expression.Quote(elementLambda))); 
} 

項目using System.Linq.Dynamic;我已在使用 - 我在另一種方法使用動態OrderBy,所以我知道它應該能夠看到它。

我有點困惑,它似乎使用動態LINQ它不明白我用什麼對象。

+0

另請參見[我在CP上的文章](http://www.codeproject.com/KB/webforms/HandleGridViewOnSorting.aspx)獲取另一個但類似解決方案的相同問題 – abatishchev

回答

5

擴展方法與此簽名

public static IQueryable GroupBy(this IQueryable source, 
     string keySelector, string elementSelector, params object[] values) 

沒有被這條線

var result = Items.AsQueryable().GroupBy("DeliveryDate"); 

調用,因爲只有一個this說法!所以編譯器認爲你經常在GroupBy(需要Func)後感到困惑。

您需要提供其他selector字符串。

編輯添加

正常GroupBylots of overloads,所以動態的LINQ需要提供一樣多的靈活性。 GroupBy產生分組序列,其中每個分組具有元素序列。如果像在傳統的LINQ調用中一樣,沒有提到元素,源對象本身就被用作元素。

例如,使用一些假設的類,OrdersOrderDate產生IEnumerable<IGrouping<DateTime, Order>>

但我們可以說,我們只關心在輸出OrderId,所以我們可以給GroupByelementSelector使其產生IEnumerable<IGrouping<DateTime, int>>

告訴動態LINQ到使用Item本身的元素,我們使用魔法字符串"it"作爲elementSelector

var result = Items.AsQueryable().GroupBy("DeliveryDate", "it"); 

這應該再有作爲傳統的LINQ呼叫

var result = Items.AsQueryable().GroupBy(i => i.DeliveryDate); 
同樣的效果
+0

謝謝!是的,它似乎工作!十分感謝你。那麼我需要通過2個字符串來實際傳遞什麼?什麼是keyselector和元素選擇器實際上是什麼? Key select = DeliveryDate ??什麼是元素選擇器? – Martin

+0

@Martin查看更新 – AakashM

+0

@AakashM:但是爲什麼呢? – abatishchev

相關問題