合并linq语句或离开

时间:2018-11-19 21:17:01

标签: c# 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();

1 个答案:

答案 0 :(得分:2)

我个人遵循的口号是:“必须编写程序供人们阅读,而只能由偶然的机器来执行”(Harold Abelson。)使代码尽可能易读(然后才担心优化/效率/等(如果需要)。优化干净代码比清理优化代码要容易。

因此,在重要的可读性方面,我会说:分解它们!将LINQ语句分成多行,可以做一些非常有价值的事情:

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

...它使您可以使用变量名来记录linq的内容。您正在使用它来提高代码的可读性。如果有的话,分组过多(版本中的3行filteredTokens行中存在 lot 。)

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

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

...是一场噩梦。到那时,我不再阅读代码,我正在慢慢尝试解密