c# - 如何将匿名结果类型用于 LINQ to SQL 的表达式委托?
问题描述
我有一个现有的 LINQ to SQL 查询,我试图在其中允许不同的分组:
var result= dc.Report_Data
.Where(x => x.Year == Year)
.Where(x => x.Month >= Month)
.GroupBy(grouping)
.Select(g => new ReportViewModel(){
Month = g.Key.Month,
Option1 = g.Key.Option1,
Option2 = g.Key.Option2,
Amount = g.Sum(x => x.Amount)
})
.ToList();
我需要允许根据外部参数对不同的属性集进行分组。我设置了一个默认值,然后使用这样的条件:
Expression<Func<Report_Data, TResult>> grouping = g => new {g.Month, Option1 = g.prop1, Option2 = g.prop2};
if (userParameter == "X"){
grouping = g => new {g.Month, Option1 = g.prop3, Option2 = g.prop4};
} else if (userParameter == "Y") {
grouping = g => new {g.Month, Option1 = g.prop5, Option2 = g.prop6};
}
然后我grouping
进入上面的查询。问题是我在分组中有一个匿名类型,Expression<Func<Report_Data, TResult>>
当我TResult
用作结果类型时出现错误。
有没有办法使用这种表达式委托格式并指定通用或匿名结果类型?(最好不必为每种结果类型创建一个类)或者我应该通过其他机制允许不同的分组吗?
解决方案
根据这篇关于构建 LINQ Queries的博客文章的解释,我找到了如下解决方案:
扩展 LINQ:
public static class Linq {
public static Expression<Func<T, R>>
Expr<T, R>(Expression<Func<T, R>> f) {
return f;
}
}
然后可以像这样设置分组:
var grouping = Linq.Expr((Report_Data g) => new {g.Month, Option1 = g.prop1, Option2 = g.prop2});
if (userParameter == "X") {
grouping = Linq.Expr((Report_Data g) => new {g.Month, Option1 = g.prop3, Option2 = g.prop4});
} else if(userParameter == "Y") {
grouping = Linq.Expr((Report_Data g) => new {g.Month, Option1 = g.prop5, Option2 = g.prop6});
}