Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq:在GroupBy中使用变量_C#_Linq - Fatal编程技术网

C# Linq:在GroupBy中使用变量

C# Linq:在GroupBy中使用变量,c#,linq,C#,Linq,我已收到此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, Tr

我已收到此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
})
.选择(组=>新建
{
group.Key.Id,
group.Key.Tri,
group.Key.SensAppel,
Count=组。Count(),
})
.OrderBy(g=>g.Tri)
.ToList();

它可以工作,但我想删除这个groupBy中可怕的重复(Id和Tri),我该如何处理?在这个概念中,我想使用一个变量来调用这个三元模型一次,它首先返回FindByNoContactModel在每个记录和SensAppel中返回的任何模型,因此您只需要在每行调用一次IsIncoming和FindByNoContactModel。根据您希望返回的行数,您可能会很快发现最好将这些查找推到别处,或者让数据库来执行

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

这就是你要找的吗

var stats=UoW.Repository
.GroupBy(a=>{
var repo=MyBLL.IsInComing(a.idSens)?MyBLL.FindByNoContactModel(a.change.idTo.GetValueOrDefault()):MyBLL.FindByNoContactModel(a.change.idFrom.GetValueOrDefault())
还新
{
Id=回购Id,
Tri=回购协议Tri,
SensAppel=a.echange_sens.nom
}
})
.选择(组=>新建
{
group.Key.Id,
group.Key.Tri,
Count=组。Count(),
})
.OrderBy(g=>g.Tri)
.ToList();

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

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

现在我们可以介绍一个

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();

您可以通过拉出公共元素,然后使用中间匿名类来保存它们来组合子表达式(我不确定EF 6将如何处理这个问题(什么是
Get
return?),因为我不知道
MyBLL
是什么):


这是LINQ到EF 6、EF Core 2、EF Core 3、SQL、对象吗?@NetMage LINQ到EF6使用流畅的语法
let
等效。不太。。。
Select
需要投影三元表达式的结果和原始
a
GroupBy
包含了
SensAppel=a.echange_sens.nom
,但是在这个版本中它丢失了。@madreflection由于原始查询没有使用或返回它,所以我放弃了它。
senseapel
是分组表达式的一部分。它不必投射或在其他地方使用才重要。最好按原样投射
a
,然后在
GroupBy
中使用原始表达式。这更接近于
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();
var stats = UoW.Repository
    .Get(echangeFilter)
    .Select(a => new {
        a.echange_sens.nom,
        fncm = MyBLL.FindByNoContactModel(
                   (MyBLL.IsInComing(a.idSens)
                       ? a.change.idTo
                       : a.change.idFrom)
                   .GetValueOrDefault())
    })
    .GroupBy(nf => new {
        Id = nf.fncm.id,
        Tri = nf.fncm.Tri,
        SensAppel = nf.nom
    })
    .Select(group => new {
        group.Key.Id,
        group.Key.Tri,
        Count = group.Count(),
    })
    .OrderBy(g => g.Tri)
    .ToList();