首页 > 解决方案 > Linq:在 GroupBy 中使用变量

问题描述

我有帮助这个 LINQ 请求:我的 c#:

var stats = UoW.Repository
    .Get(echangeFilter)
    .GroupBy(a => new
    {
        Id = MyBLL.IsInComing(a.idSens) ? MyBLL.FindByNoContactModel(a.change.idTo.GetValueOrDefault()).id : MyBLL.FindByNoContactModel(a.change.idFrom.GetValueOrDefault()).id,
        Tri = MyBLL.IsInComing(a.idSens) ? MyBLL.FindByNoContactModel(a.change.idTo.GetValueOrDefault()).Tri: MyBLL.FindByNoContactModel(a.change.idFrom.GetValueOrDefault()).Tri,
        SensAppel = a.echange_sens.nom
    })
    .Select(group => new
    {
        group.Key.Id, 
        group.Key.Tri,
        group.Key.SensAppel,
        Count = group.Count(),
    })
    .OrderBy(g => g.Tri)
    .ToList();

它有效,但我想在这个 groupBy 中删除这个可怕的重复(Id 和 Tri),我该如何处理?在概念上,我想用一个变量来调用这个三元一次

标签: c#linq

解决方案


如果使用查询语法,则可以声明变量。

这就是您的查询在查询语法中的样子(请正确命名您的变量。我不知道您实际上在做什么,所以我无法命名它们......):

var query = from a in UoW.Repository
    .Get(echangeFilter)
    group a by new
    {
        Id = MyBLL.IsInComing(a.idSens) ? MyBLL.FindByNoContactModel(a.change.idTo.GetValueOrDefault()).id : MyBLL.FindByNoContactModel(a.change.idFrom.GetValueOrDefault()).id,
        Tri = MyBLL.IsInComing(a.idSens) ? MyBLL.FindByNoContactModel(a.change.idTo.GetValueOrDefault()).Tri: MyBLL.FindByNoContactModel(a.change.idFrom.GetValueOrDefault()).Tri,
        SensAppel = a.echange_sens.nom
    } into g
    let b = new
    {
        group.Key.Id, 
        group.Key.Tri,
        Count = group.Count(),
    }
    orderby g.Tri
    select g;
var stats = query.ToList();

现在我们可以引入一个let

var query = from a in UoW.Repository
    .Get(echangeFilter)
    let x = MyBLL.IsInComing(a.idSens) ? MyBLL.FindByNoContactModel(a.change.idTo.GetValueOrDefault()) : MyBLL.FindByNoContactModel(a.change.idFrom.GetValueOrDefault())
    group a by new
    {
        Id = x.id,
        Tri = x.Tri,
        SensAppel = a.echange_sens.nom
    } into g
    let b = new
    {
        g.Key.Id, 
        g.Key.Tri,
        Count = g.Count(),
    }
    orderby g.Tri
    select g;
var stats = query.ToList();

推荐阅读