实体框架动态在OR条件下的位置

时间:2014-01-10 12:48:33

标签: asp.net entity-framework lambda unit-of-work

我只是想知道如何使用EntityFramwork创建动态。例如,我需要动态地构建这个查询,但是我必须检查一个条件并且它传递然后concat在哪里,但是将与我想要OR的其他条件进行AND。 这是我的例子:

public IEnumerable<Data> GetAllData(Criteria searchCriteria)
{
var Query = this._repository.Retrieve();

if (searchCriteria.condition1)
{
    Query = Query.Where(p => (p.value1> 0 || p.value2 > 0));
}
if (searchCriteria.condition2)
{
    Query = Query.Where(p => (p.value3> 0 || p.value4 > 0));
}
if (searchCriteria.contition3)
{
    Query = Query.Where(p => (p.value5> 0 || p.value6 > 0));
}

return Query.Distinct().OrderBy(c=>c.ID).ToList();
}

这将返回与所有条件匹配的所有数据,具体取决于它是否通过了条件。但我认为这将是和AND,但我希望返回所有数据至少匹配一个条件,至少一个。 谢谢你的帮助!!!

1 个答案:

答案 0 :(得分:0)

为什么不让GetAllData()评估一个条件,并为需要检查的每个条件多次调用它?你想要达到的目的意味着你的函数将有多个理由改变=难以重构和难以理解。

public IEnumerable<Data> GetAll(Func<Data, bool> criteria)
{
    var query = this._repository.Retrieve();
    return query.Where(t => criteria(t)).OrderBy(c => c.ID).ToList();
}

如果您绝对必须同时处理多个条件,请传入params Func<Data,bool>参数并迭代数组,随时连接查询。

编辑:使用延迟执行从存储库中检索数据后过滤掉数据。

    public IEnumerable<T> GetAll()
    {
        var query = this._repository.Retrieve();
        // Remove ToList so you can utilize deferred execution
        return query.Where(t => criteria(t)).OrderBy(c => c.ID); // .ToList();
    }

    var enumerable = GetAll();
    if(condition) 
         enumerable = enumerable.Where( ... )
    if(condition2) 
         enumerable = enumerable.Where( ... )

EDIT2看来你的问题不是技术诀窍问题,而是设计问题。我建议(在我们在评论中讨论之后),你会研究strategy设计模式,并重新思考你是如何处理这个问题的。