实体框架 - 在查询中使用条件语句

时间:2014-10-24 11:54:50

标签: c# oracle entity-framework

美好的一天,

我有三个列表(ICollection of strings)。我的目的是使用linq to entities从基于这些列表中存储的值中获取db的结果。以下是我的代码段

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

上述查询的目标是在尝试根据其内容获取记录之前检查列表是否为空。如果所有列表都有条目,则上述操作非常有效。但是,如果它们中的任何一个或全部都是空的,则会失 如何进行此工作,即如果有条目则使用列表查询数据库,如果列表为空,则获取条件的所有条目。 任何帮助将不胜感激。谢谢你们

1 个答案:

答案 0 :(得分:1)

您不必一次完成整个查询,将其分解并仅在需要时进行过滤:

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