C# Linq:在GroupBy中使用变量
我已收到此LINQ请求的帮助: 我的c#: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
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();