C# 如何使用Group by在Linq语句中引入Let关键字
我有以下带有'Group by'子句的Linq语句,我想知道如何引入let或任何其他语句以避免重复子查询,C# 如何使用Group by在Linq语句中引入Let关键字,c#,.net,linq,group-by,C#,.net,Linq,Group By,我有以下带有'Group by'子句的Linq语句,我想知道如何引入let或任何其他语句以避免重复子查询,lifecycleEvents.Where(I=>I.LifecycleEventId==grouping.Key) var completionTimeModels = from timeline in processTimelines group timeline by timeline.LifecycleEventId into grouping select
lifecycleEvents.Where(I=>I.LifecycleEventId==grouping.Key)
var completionTimeModels =
from timeline in processTimelines
group timeline by timeline.LifecycleEventId into grouping
select new CompletionTimeViewModel()
{
// How to avoid repeating the same query to find the life cycle event?
Name = lifecycleEvents.Where(i => i.LifecycleEventId == grouping.Key).First().LifecycleEventName,
DisplayName = lifecycleEvents.Where(i => i.LifecycleEventId == grouping.Key).First().LifecycleEventDisplayName
};
所有这些答案都是相同的。这真的很简单。首先使用(i=>i.lifecycleventid==grouping.Key)
因为lifecycleventid是不同的,我们可以有许多分组键,所以哪个键将作为grouping.Key?@amesh参与查询,因为分组组中的每个项都将具有相同的键。然后,我们将根据组的密钥从每个组的lifecycleEvents中挑选一个项目。第一个调用在每个组中运行一次。对组的调用返回一个IEnumerable组,该组在对select的调用中迭代,该调用也会对每个组调用.first一次。每个组进行一次.First调用,它本身不会在所有组上迭代。请使用First(i=>i.lifecycleventid==grouping.Key)
UseFirst(i=>i.lifecycleventid==grouping.Key)
@abatishchev:绝对正确。我很惊讶我自己没听清楚。将谓词传递给非Where扩展方法是我最喜欢的低估/未充分使用的linq技术之一。
var completionTimeModels =
from timeline in processTimelines
group timeline by timeline.LifecycleEventId into grouping
let foo = lifecycleEvents.First(i => i.LifecycleEventId == grouping.Key)
select new CompletionTimeViewModel()
{
Name = foo.LifecycleEventName,
DisplayName = foo.LifecycleEventDisplayName
};
var completionTimeModels =
from timeline in processTimelines
group timeline by timeline.LifecycleEventId into grouping
let current = lifecycleEvents.Where(i => i.LifecycleEventId == grouping.Key).First()
select new CompletionTimeViewModel()
{
// How to avoid repeating the same query to find the life cycle event?
Name = current.LifecycleEventName,
DisplayName = current.LifecycleEventDisplayName
};
var completionTimeModels =
from timeline in processTimelines
group timeline by timeline.LifecycleEventId into grouping
let lifecyleEvent = lifecycleEvents.Where(i => i.LifecycleEventId == grouping.Key).First()
select new CompletionTimeViewModel()
{
Name = lifecyleEvent.LifecycleEventName,
DisplayName = lifecyleEvent.LifecycleEventDisplayName
};
var completionTimeModels =
from timeline in processTimelines
group timeline by timeline.LifecycleEventId into grouping
let lifecyleEvent = lifecycleEvents.First(i => i.LifecycleEventId == grouping.Key)
select new CompletionTimeViewModel()
{
// How to avoid repeating the same query to find the life cycle event?
Name = lifecyleEvent.LifecycleEventName
DisplayName = lifecyleEvent.LifecycleEventDisplayName
};