我需要的是代表通過Linq.Expressions此查詢:的GroupBy查詢通過Linq.Expressions和Lambda表達式
db.Documents.GroupBy(a => 1).Select(b => b.Sum(c => c.Amount) });
這是我到目前爲止有:
IQueryable<Document> data = db.Documents;
ParameterExpression pe = Expression.Parameter(typeof(Document), "doc");
Expression groupBy = Expression.Call(
typeof(Queryable),
"GroupBy",
new Type[] { typeof(Document), typeof(int) },
data.Expression,
Expression.Lambda(Expression.Constant(1), pe));
ParameterExpression peg = Expression.Parameter(typeof(IGrouping<int, Document>), "group");
Expression select = Expression.Call(
typeof(Queryable),
"Select",
new Type[] { typeof(IGrouping<int, Document>), typeof(int) },
groupBy,
Expression.Lambda(Expression.Property(peg, "Key"), peg));
foreach (var item in data.Provider.CreateQuery(select)) { ... }
這是實施:
db.Documents.GroupBy(a => 1).Select(b => b.Key });
它完美的工作。現在,我想彙總一筆,而不是訪問組的關鍵。
這是對我來說很棘手的地方。我想是這樣的:在
...b.Sum(c => c.Amount)
ParameterExpression pe1 = Expression.Parameter(typeof(Document), "other");
Expression sum = Expression.Call(
typeof(Queryable),
"Sum",
new Type[] { typeof(Document) },
peg,
Expression.Lambda(Expression.Property(pe1, "Amount"), pe1));
而且,Sum函數智能感知給人簽名:
IEnumerable<Document>.Sum<Document>(Func<Document, decimal> selector)
雖然:
db.Documents.Sum(a => a.Amount)
我得到:
IQueryable<Document>.Sum<Document>(Expression<Func<Document, decimal>> selector)
選擇器是Func在一個版本和表達式在其他。我不知道如何在Linq表達式中處理Func。也許智能感知是錯誤的?
表達聚合源是我最大的問題。通過觀察:
...b.Sum(c => c.Amount)
我會假定乙方應IGrouping(的「選擇」 ParameterExpression),這應該是求和的來源,但不會編譯。 我不知道還有什麼要嘗試?
這裏是選擇表達式應該怎麼過去的樣子:
Expression Select = Expression.Call(
typeof(Queryable),
"Select",
new Type[] { typeof(IGrouping<int, Document>), typeof(decimal?) },
GroupBy,
Expression.Lambda(sum, peg));
但我甚至無法達到,因爲失敗「和」表達了這一點。
任何指針,將不勝感激。
Regards,
只是好奇什麼一個恆定的分組點? – dasblinkenlight
我需要在相同的數據在同一時間幾個聚合,所以它是唯一的方式與單數據庫命中 –