Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 如何使用Group by在Linq语句中引入Let关键字_C#_.net_Linq_Group By - Fatal编程技术网

C# 如何使用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

我有以下带有'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 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)
Use
First(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
    };