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)
我的思绪在如何将这两者结合在一起是一片空白.
由于两个查询之间发生的所有更改都是组键,因此请将其参数化。由于它是一个复合键(其中包含多个值),因此您需要创建一个简单的类来保存这些值(具有通用名称)。
在这种情况下,要对其进行参数化,请将键选择器作为函数的参数。它必须是一个表达式和方法语法才能使其正常工作。然后您可以将其概括为一个函数:
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)
我不知道您为实体映射了哪些类型,所以我做了一些假设。使用适合您情况的任何内容。
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |