最近我遇到了修復如下所示的錯誤的代碼。 這只是很難理解它,並使改變看起來也很危險。 有沒有簡單的方法來分解這種查詢,即德摩根定律或以不同的方式重寫。簡化多條件下的複雜linq查詢
SomeReturnType xyz()
{
return (from m in this.context.tblMessages
where m.SystemActionID.HasValue &&
(userID == null || m.RecipientID == null || m.RecipientID == userID) &&
m.TargetUserType == userType &&
(
(territoryID.HasValue && !m.TerritoryID.HasValue) ||
(!territoryID.HasValue && !m.TerritoryID.HasValue) ||
(territoryID.HasValue && m.TerritoryID.HasValue && territoryID.Value == m.TerritoryID.Value)
) &&
(
(regionID.HasValue && !m.RegionID.HasValue) ||
(!regionID.HasValue && !m.RegionID.HasValue) ||
(regionID.HasValue && m.RegionID.HasValue && regionID.Value == m.RegionID.Value)
) &&
(
(teamID.HasValue && !m.TeamID.HasValue) ||
(!teamID.HasValue && !m.TeamID.HasValue) ||
(teamID.HasValue && m.TeamID.HasValue && teamID.Value == m.TeamID.Value)
) &&
m.SystemActionData == additionalData &&
(!completed.HasValue || m.IsSystemActionCompleted == completed.Value)
select m).FirstOrDefault();
} //function xyz ends
LINQ * is * using IQueryable。 –
@PanagiotisKanavos:你究竟是什麼意思?我告訴我需要IQueryable來存儲中間結果(一些表達式樹),而不是在同一個語句中執行查詢。請在任何評論前仔細閱讀來源。 – Maxim
沒有中間結果。 IQueryable是查詢的抽象,而不是查詢的結果。你正在做的是*組成一個查詢。實際上,您可以將代碼重寫爲query2 = query1.Where(account => account.ID> 100); query3 = query2.Select(...)'和結果將完全相同。當你調用'ToList()'時,最終只有一個查詢會被髮送到服務器。 –