C# 条件化LINQ查询

C# 条件化LINQ查询,c#,linq,C#,Linq,目前我有一个LINQ查询,如下所示: var policy = snapshotDate == null ? await _dbContext.VPolicies .Where(p => p.PolicyNumber.Trim().Equals(policyNumber)) .OrderByDescending(d => d.PolicyEffectiveD

目前我有一个LINQ查询,如下所示:

var policy = snapshotDate == null
                ? await _dbContext.VPolicies
                        .Where(p => p.PolicyNumber.Trim().Equals(policyNumber))
                        .OrderByDescending(d => d.PolicyEffectiveDate)
                        .FirstOrDefaultAsync()
                : await _dbContext.VPolicies
                        .Where(p => p.PolicyNumber.Trim().Equals(policyNumber)
                                    && (p.PolicyEffectiveDate <= snapshotDate && p.PolicyExpirationDate > snapshotDate))
                        .OrderByDescending(d => d.PolicyEffectiveDate)
                        .FirstOrDefaultAsync();
        var policy = await _dbContext.VPolicies
                                .Where(p => p.PolicyNumber.Trim().Equals(policyNumber))
                                .Where(p => snapshotDate != null && (p.PolicyEffectiveDate <= snapshotDate && p.PolicyExpirationDate > snapshotDate))
                                .OrderByDescending(d => d.PolicyEffectiveDate)
                                .FirstOrDefaultAsync();
我想知道我是否可以这样缩短它:

var policy = snapshotDate == null
                ? await _dbContext.VPolicies
                        .Where(p => p.PolicyNumber.Trim().Equals(policyNumber))
                        .OrderByDescending(d => d.PolicyEffectiveDate)
                        .FirstOrDefaultAsync()
                : await _dbContext.VPolicies
                        .Where(p => p.PolicyNumber.Trim().Equals(policyNumber)
                                    && (p.PolicyEffectiveDate <= snapshotDate && p.PolicyExpirationDate > snapshotDate))
                        .OrderByDescending(d => d.PolicyEffectiveDate)
                        .FirstOrDefaultAsync();
        var policy = await _dbContext.VPolicies
                                .Where(p => p.PolicyNumber.Trim().Equals(policyNumber))
                                .Where(p => snapshotDate != null && (p.PolicyEffectiveDate <= snapshotDate && p.PolicyExpirationDate > snapshotDate))
                                .OrderByDescending(d => d.PolicyEffectiveDate)
                                .FirstOrDefaultAsync();
但这不起作用,我想知道如何以适当的方式处理这个LINQ查询,并在不使用Terenery运算符的情况下缩短它们

提前感谢。

您似乎希望对自己的病情进行评估

snapshotDate == null || (p.PolicyEffectiveDate <= snapshotDate && p.PolicyExpirationDate > snapshotDate)
也就是说,当snapshotDate为空时,请给出所有日期;否则,请给出范围内的日期

注意:关于多个where子句。在基于内存的集合中,由于额外的委托调用和潜在的多重枚举,将它们与&&相结合,您将获得性能提高,但是对于大多数LINQ to查询提供程序,它将在完全相同的SQL中进行计算。尽管一般来说,如果可以的话,最好将它们结合起来。

试试这个:

var policy = await _dbContext.VPolicies
                                .Where(p => p.PolicyNumber.Trim().Equals(policyNumber)
                                 && (snapshotDate == null ||
                                 (p.PolicyEffectiveDate <= snapshotDate && 
                                  p.PolicyExpirationDate > snapshotDate)))
                                 .OrderByDescending(d => d.PolicyEffectiveDate)
                                 .FirstOrDefaultAsync();

如果snapshotDate不为null,此查询将应用PolicyEffectiveDate和PolicyExpirationDate的条件,否则仅应用PolicyNumber条件。

什么是不起作用?当我不提供快照日期时,第一个LINQ查询将获得所有结果。当我不提供快照日期时,第二个linq查询为null