C# 合并linq语句或离开

C# 合并linq语句或离开,c#,linq,C#,Linq,我有以下代码。linq语句应该合并还是保持原样? 我通常喜欢打破它,但我的团队中的一些成员喜欢一行 想法 var startDate = DateTime.UtcNow; var endDate = startDate.AddDays(expirationDays); var allTokens = await repository.Query<Domain.Models.AccessToken>() .Whe

我有以下代码。linq语句应该合并还是保持原样? 我通常喜欢打破它,但我的团队中的一些成员喜欢一行

想法

        var startDate = DateTime.UtcNow;
        var endDate = startDate.AddDays(expirationDays);

        var allTokens = await repository.Query<Domain.Models.AccessToken>()
            .Where(x => !x.IsRevoked)
            .ToListAsync()
            .ConfigureAwait(false);

        var filteredTokens = allTokens.GroupBy(x => x.ApplicationName)
            .Select(y => y.OrderByDescending(z => z.ExpirationDate).FirstOrDefault())
            .Where(x => x != null && ! x.IsRevoked && x.ExpirationDate >= startDate && x.ExpirationDate <= endDate);

        return filteredTokens.Select(x => x.Id).ToList();
var startDate=DateTime.UtcNow;
var endDate=startDate.AddDays(到期日);
var allTokens=await repository.Query()
.其中(x=>!x.0)
.ToListAsync()
.配置等待(错误);
var filteredTokens=allTokens.GroupBy(x=>x.ApplicationName)
.Select(y=>y.OrderByDescending(z=>z.ExpirationDate).FirstOrDefault())
。其中(x=>x!=null&&!x.isr&&x.ExpirationDate>=startDate&&x.ExpirationDate x.Id)。ToList();

就我个人而言,我遵循这样一条格言:“程序必须为人们阅读而编写,而且只是为了机器执行而编写”(Harold Abelson)。让代码尽可能可读(只有在需要时才担心优化/效率等)。优化干净的代码比清理优化的代码更容易

所以在这一重要的可读性方面,我要说:把它们拆开!将LINQ语句拆分为多行可以让您做一些非常有价值的事情:

var records = someLinqStatement;
var activeUserRecords = records.SomeLinqStatement;
var mostRecentUserRecords = activeUserRecords.SomeLinqStatement;
。。。它允许您使用变量名来记录linq的内容。您正在使用它来提高代码的可读性。如果有什么不同的话,那就是分组太多(在您的版本中,3行filteredTokens行中有很多内容)

尝试阅读你的同事会有什么:

var allTokens = await repository.Query<Domain.Models.AccessToken>()
        .Where(x => !x.IsRevoked)
        .ToListAsync()
        .ConfigureAwait(false)
        .GroupBy(x => x.ApplicationName)
        .Select(y => y.OrderByDescending(z => z.ExpirationDate).FirstOrDefault())
        .Where(x => x != null && ! x.IsRevoked && x.ExpirationDate >= startDate && x.ExpirationDate <= endDate)
        .Select(x => x.Id).ToList();
var allTokens=await repository.Query()
.其中(x=>!x.0)
.ToListAsync()
.ConfigureWait(错误)
.GroupBy(x=>x.ApplicationName)
.Select(y=>y.OrderByDescending(z=>z.ExpirationDate).FirstOrDefault())
。其中(x=>x!=null&&!x.isr&&x.ExpirationDate>=startDate&&x.ExpirationDate x.Id)。ToList();

。。。这是一场可怕的噩梦。在这一点上,我不再阅读代码,我正在慢慢地尝试破译它。

ha,这完全取决于您。这个问题很难回答。这里的主要区别在于最终从数据库中提取多少数据并在内存中过滤,而不是让数据库为您处理。是否需要
allTokens
作为列表?这是一个没有调用
ToListAsync
的查询吗?如果是这样,那么,如果您删除了
ToListAsync
调用,那么一次完成所有操作或将其作为三个单独的语句来完成完全是一个品味问题。这也使得在调试时查看中间结果变得容易。