簡體   English   中英

實體框架-在查詢中使用條件語句

[英]Entity Framework - Use condition statements in query

大家好,

我有三個列表(字符串的ICollection)。 我的意圖是使用linq to實體根據存儲在這些列表中的值從數據庫中獲取結果。 以下是我的片段

int entityCriteriaCount = entityCriteria == null ? 0 : entityCriteria.Count();
int operationCriteriaCount = operationCriteria == null ? 0 : operationCriteria.Count();
int roleCriteriaCount = roleCriteria == null ? 0 : roleCriteria.Count();
// Where entityCriteria,operationCriteria and roleCriteria are the above mentioned lists

資料查詢:

var auditItems = db.AuditTrails.Where(a => (entityCriteriaCount > 0 ? reportCriteria.EntityTypes.Contains(a.EntityType) : a.EntityType.Contains(""))
&& (roleCriteriaCount > 0 ? reportCriteria.Roles.Contains(a.UserRole) : a.UserRole.Contains(""))
&& (operationCriteriaCount > 0 ? reportCriteria.Operations.Contains(a.UserAction) : a.UserAction.Contains(""))
&& EntityFunctions.TruncateTime(a.TimeStamp) >= startDate
&& EntityFunctions.TruncateTime(a.TimeStamp) <= endDate).OrderByDescending(a => a.TimeStamp).ToList();

上面查詢的目的是在嘗試根據列表內容獲取記錄之前檢查列表是否為空。 如果所有列表都有條目,則上面的方法非常有效。 但是,如果其中任何一個或全部為空,則失敗。 如何進行這項工作,即如果有條目,則使用列表查詢數據庫,如果列表為空,則獲取標准的所有條目。 任何幫助將不勝感激。 多謝你們

您不必一次性完成整個查詢,將其分解,僅在需要時才進行過濾:

var auditItems = db.AuditTrails.Where(EntityFunctions.TruncateTime(a.TimeStamp) >= startDate && EntityFunctions.TruncateTime(a.TimeStamp) <= endDate);

if(entityCriteriaCount > 0)
    auditItems = auditItems.Where(a => reportCriteria.EntityTypes.Contains(a.EntityType));
if(roleCriteriaCount > 0)
    auditItems = auditItems.Where(a => reportCriteria.Roles.Contains(a.UserRole));
if(operationCriteriaCount > 0)
    auditItems = auditItems.Where(a => reportCriteria.Operations.Contains(a.UserAction));

var results = auditItems.OrderByDescending(a => a.TimeStamp).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM