将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子句中的最后一项不同。它们能合并在一起吗?

如果您根据"条件"选择任何一个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();

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

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

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

也许您正在寻找这样的东西。

创建一种方法来进行普通检查

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

最新更新