EF附加到IQueryable a生成OR的位置

时间:2016-03-05 17:15:15

标签: entity-framework linq iqueryable

我试图在桌面上实现动态过滤。我的UI具有可以按需启用或禁用的过滤器,您可以想象,我的查询应该能够知道何时向查询添加过滤器。

到目前为止,我检查过滤器对象是否有值,如果有,则为其添加where子句。例如:

var q1 = DBContext.Table1

if (!string.IsNullOrEmpty(filterModel.SubjectContains))
    q1 = q1.Where(i => i.Subject.Contains(filterModel.SubjectContains));

if (filterModel.EnvironmentId != null)
    q1 = q1.Where(i => i.EnvironmentId == filterModel.EnvironmentId);

if (filterModel.CreatedBy != null)
    q1 = q1.Where(i => i.CreatedByUserId == filterModel.CreatedBy);

var final = q1.Select(i => new
                    {
                        IssuesId = i.IssuesId,
                        Subject = i.Subject,
                        EnvironmentId = i.EnvironmentId,
                        CreatedBy = i.CreatedByUser.FullName,
                    });

return final.ToList();

上面的代码生成T-SQL,其中包含使用WHERE组合条件的每个字段的AND子句。这很好,适用于大多数情况。

类似的东西:

Select 
    IssueId, Subject, EnvironmentId, CreatedById 
From 
    Table1 
Where
   (Subject like '%stackoverflow%') 
   and (EnvironmentId = 1) 
   and (CreatedById = 123)

但是我有一个明确需要IssueId的过滤器。我试图找出EF Where子句如何为我生成OR。我正在寻找应该生成如下所示的Tsql的东西:

Select 
    IssueId, Subject, EnvironmentId, CreatedById 
From 
    Table1 
Where 
    (Subject like '%stackoverflow%') 
    and (EnvironmentId = 1) 
    and (CreatedById = 123)
    or (IssueId = 10001)

1 个答案:

答案 0 :(得分:0)

为此找到了一个解决方案,它不需要进行多个数据库调用,对我有用。

//filterModel.StaticIssueIds is of type List<Int32>
if (filterModel.StaticIssueIds != null)
{
    //Get all ids declared in filterModel.StaticIssueIds
    var qStaticIssues = DBContext.Table1.Where(i => filterModel.StaticIssueIds.Contains(i.IssuesId));

    //Let's get all Issues that isn't declared in filterModel.StaticIssueIds from the original IQueryable
    //we have to do this to ensure that there isn't any duplicate records.
    q1 = q1.Where(i => !filterModel.StaticIssueIds.Contains(i.IssuesId));

    //We then concatenate q1 and the qStaticIssues.
    q1 = q1.Concat(qStaticIssues);
}

var final = q1.Select(i => new
    {
        IssuesId = i.IssuesId,
        Subject = i.Subject,
        EnvironmentId = i.EnvironmentId,
        CreatedBy = i.CreatedByUser.FullName,
    });

return final.ToList();