首页 > 解决方案 > 合并 linq 语句或离开

问题描述

我有以下代码。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();

标签: c#linq

解决方案


就我个人而言,我遵循这样的口头禅,“程序必须写给人们阅读,并且只是偶然地让机器执行”(Harold Abelson。)使代码尽可能可读(然后才在需要时担心优化/效率/等)。优化干净的代码比清理优化的代码更容易。

所以在重要的可读性方面,我会说:Break them Up!将您的 LINQ 语句分成多行可以让您做一些非常有价值的事情:

var records = someLinqStatement;
var activeUserRecords = records.SomeLinqStatement;
var mostRecentUserRecords = activeUserRecords.SomeLinqStatement;

...它允许您使用变量名称来记录 linq 的内容。您正在使用它来提高代码的可读性。如果有的话,分组的太多了(在你的版本中的 3 行过滤令牌行中发生了很多事情。)

尝试阅读您的同事会拥有的内容:

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

……真是一场噩梦。那时,我不再阅读代码,我正在慢慢尝试破译它。


推荐阅读