结合linq查询在一起

时间:2018-12-03 13:46:57

标签: c# linq

我必须linq查询,它们之间只有很小的区别。我正在尝试将两者合并。

.Where(i => 
    !i.Username.StartsWith("e-") &&
    i.SSN != null && i.SSN != "" && 
    i.DisplayName != null && i.DisplayName != "" && 
    i.LastName != null && i.LastName != "" && 
    i.FirstName != null && i.FirstName != "")
.ToList();

另一个是

.Where(i => 
    !i.Username.StartsWith("e-") && 
    i.SSN != null && i.SSN != "" && 
    i.DisplayName != null && i.DisplayName != "" && 
    i.LastName != null && i.LastName != "" && 
    i.FirstName != null && i.FirstName != "" && 
    i.WhenChanged.HasValue && i.WhenChanged.Value > DateTime.UtcNow.Add(_whenChangedTimeSpan))
.ToList();

,因为您只能看到where子句中的最后一项不同。它们可以合并在一起吗?

3 个答案:

答案 0 :(得分:2)

如果您基于“条件”选择任何一个Linq查询,则可以执行以下操作。

var result = list.Where(
                i => !i.Username.StartsWith("e-")
                     && i.SSN != null && i.SSN != ""
                     && i.DisplayName != null && i.DisplayName != ""
                     && i.LastName != null && i.LastName != ""
                     && i.FirstName != null && i.FirstName != ""
                     && (condition? 
                     i.WhenChanged.HasValue && i.WhenChanged.Value > DateTime.UtcNow.Add(_whenChangedTimeSpan) 
                     : true)).ToList();

答案 1 :(得分:0)

也许您正在寻找类似的东西。

创建一种进行通用检查的方法

bool CommonCheck(TypeOfYourVariable i)
{
    return !i.Username.StartsWith("e-") &&
        i.SSN != null && i.SSN != "" &&
        i.DisplayName != null && i.DisplayName != "" &&
        i.LastName != null && i.LastName != "" &&
        i.FirstName != null && i.FirstName != "";
}

像这样使用它:

// first
.Where(i => CommonCheck(i))
.ToList();

// secpmd
.Where(i => CommonCheck(i) &&
    i.WhenChanged.HasValue && i.WhenChanged.Value > DateTime.UtcNow.Add(_whenChangedTimeSpan))
.ToList();

更新,或者您可以执行以下操作:

var firstQueryResult = yourInput.Where(i => 
    !i.Username.StartsWith("e-") &&
    i.SSN != null && i.SSN != "" &&
    i.DisplayName != null && i.DisplayName != "" &&
    i.LastName != null && i.LastName != "" &&
    i.FirstName != null && i.FirstName != "" &&
).ToList();

var secondQueryResult = firstQueryResult
    .Where(i=> i.WhenChanged.HasValue && i.WhenChanged.Value > DateTime.UtcNow.Add(_whenChangedTimeSpan))
    .ToList();

答案 2 :(得分:0)

由于第二个查询只是第一个查询的子集,因此首先执行第一个查询,然后对该结果运行过滤器:

var result = (...).Where(
i => !i.Username.StartsWith("e-")
&& i.SSN != null && i.SSN != ""
&& i.DisplayName != null && i.DisplayName != ""
&& i.LastName != null && i.LastName != ""
&& i.FirstName != null && i.FirstName != ""
).ToList();

var filteredResult = result.Where(i.WhenChanged.HasValue && i.WhenChanged.Value > DateTime.UtcNow.Add(_whenChangedTimeSpan)).ToList();

这将只对数据库运行一次查询,并将在应用服务器的内存中执行第二部分。