我只是想知道如何使用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,但我希望返回所有数据至少匹配一个条件,至少一个。 谢谢你的帮助!!!
答案 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设计模式,并重新思考你是如何处理这个问题的。