繁体   English   中英

如何将匿名结果类型用于 LINQ 到 SQL 的表达式委托?

[英]How would I use an anonymous result type for an expression delegate for LINQ to SQL?

我有一个现有的 LINQ 到 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传递给上面的查询。 问题是当我使用TResult作为结果类型时,我在分组和Expression<Func<Report_Data, TResult>>错误中有一个匿名类型。

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

根据这篇关于构建 LINQ 查询的博客文章的解释,我找到了如下解决方案:

扩展 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});
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM