首页 > 解决方案 > 如何将匿名结果类型用于 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用作结果类型时出现错误。

有没有办法使用这种表达式委托格式并指定通用或匿名结果类型?(最好不必为每种结果类型创建一个类)或者我应该通过其他机制允许不同的分组吗?

标签: c#sqllinqlambdadelegates

解决方案


根据这篇关于构建 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});
}

推荐阅读