有没有办法减少这两个linq查询中的重复

Mar*_*way 6 c# linq entity-framework

构建一堆报告,必须在不同的字段中反复做同样的事情

    public List<ReportSummary> ListProducer()
    {
        return (from p in Context.stdReports                    
                group p by new { p.txt_company, p.int_agencyId }
                    into g
                    select new ReportSummary
                    {
                        PKi = g.Key.int_agencyId,
                        Name = g.Key.txt_company,
                        Sum = g.Sum(foo => foo.lng_premium),
                        Count = g.Count()
                    }).OrderBy(q => q.Name).ToList();
    }

    public List<ReportSummary> ListCarrier()
    {
        return (from p in Context.stdReports
                group p by new { p.txt_carrier, p.int_carrierId }
                    into g
                    select new ReportSummary
                    {
                        PKi = g.Key.int_carrierId,
                        Name = g.Key.txt_carrier,
                        Sum = g.Sum(foo => foo.lng_premium),
                        Count = g.Count()
                    }).OrderBy(q => q.Name).ToList();
    }
Run Code Online (Sandbox Code Playgroud)

我的思绪在如何将这两者结合在一起是一片空白.

Jef*_*ado 0

由于两个查询之间发生的所有更改都是组键,因此请将其参数化。由于它是一个复合键(其中包含多个值),因此您需要创建一个简单的类来保存这些值(具有通用名称)。

在这种情况下,要对其进行参数化,请将键选择器作为函数的参数。它必须是一个表达式和方法语法才能使其正常工作。然后您可以将其概括为一个函数:

public class GroupKey
{
    public int Id { get; set; }
    public string Name { get; set; }
}

private IQueryable<ReportSummary> GetReport(
    Expression<Func<stdReport, GroupKey>> groupKeySelector)
{
    return Context.stdReports
        .GroupBy(groupKeySelector)
        .Select(g => new ReportSummary
        {
            PKi = g.Key.Id,
            Name = g.Key.Name,
            Sum = g.Sum(report => report.lng_premium),
            Count = g.Count(),
        })
        .OrderBy(summary => summary.Name);
}
Run Code Online (Sandbox Code Playgroud)

然后只需使用适当的键选择器在查询中使用此函数即可。

public List<ReportSummary> ListProducer()
{
    return GetReport(r =>
        new GroupKey
        {
            Id = r.int_agencyId,
            Name = r.txt_company,
        })
        .ToList();
}

public List<ReportSummary> ListCarrier()
{
    return GetReport(r =>
        new GroupKey
        {
            Id = r.int_carrierId,
            Name = r.txt_carrier,
        })
        .ToList();
}
Run Code Online (Sandbox Code Playgroud)

我不知道您为实体映射了哪些类型,所以我做了一些假设。使用适合您情况的任何内容。