【问题标题】:Entity FrameWork Dynamic Where with OR Condition实体框架动态 Where 与 OR 条件
【发布时间】:2014-01-10 12:48:32
【问题描述】:

我只是想知道如何使用 EntityFramwork 创建一个动态的 where。例如,我需要动态构建此查询,但我必须检查一个条件,然后它通过了连接 where,但会与我想要 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,但我希望返回所有数据至少与一个条件匹配,至少一个。 感谢您的帮助!!!

【问题讨论】:

  • 我不认为我正在尝试做的事情是错误的......它只是一个查询构建器......我想知道如何为那些通过条件的人构建一个函数列表,使一个或与他们并将其添加到 where 子句。

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


【解决方案1】:

为什么不只允许 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&lt;Data,bool&gt; 参数并迭代数组,在执行过程中连接查询。

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

    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 看来您的问题不是技术知识问题,而是设计问题。我建议(在我们在 cmets 中讨论之后)您查看 strategy 设计模式并重新考虑您是如何处理这个问题的。

【讨论】:

  • 因为我有几个条件。从我的主页我有一些标准,我通过所有标准的对象,它不只是一个。如果你知道我的意思...
  • 我明白了。我可以看到 Criteria 类吗?
  • 我会假设布尔值是你的条件,对吧?
  • 全部,我想按 DistrictID、CountyID 等搜索......还有布尔值和主题中的 int 元素......,特别是问题在于可为空的布尔值,因为我如果通过条件,则需要它们之间的 Or...
  • 为什么不能只获取所有数据,然后在进行过程中减少可枚举?尝试做魔法(您正在尝试做的事情)并添加多个更改功能的原因只会在您不可避免地需要更改某些内容时引起问题。
猜你喜欢
  • 2013-12-02
  • 2010-10-06
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
相关资源
最近更新 更多