繁体   English   中英

LINQ实体框架动态查询

[英]LINQ dynamic query for entity framework

我有两个Guid集合:

List<Guid> statuses;
List<Guid> priorities;

如何进行以下查询:

var result = context.Activity.Where(a => 
    (a.StatusID == statuses[0] || a.StatusID == statuses[1] || ... || a.StatusID == statuses[n]) &&
    (a.PriorityID == priorities[0] || a.PriorityID == priorities[1] || ... || a.PriorityID  == priorities[m]))

集合可能为空,在这种情况下,我们不应该添加适当的“ AND”条件。 怎样做这样的动态查询?

更新

嗯,想象一下我需要这样的东西:

List<Func<Activity, bool>> conds = new List<Func<Activity, bool>>();

var result = context.Activity.Where(conds[0] || (conds[1] && conds[2]))

怎么做?

根据问题的第一个答案
仅选择StatusID处于statussesPriorityID处于priorities PriorityID那些Activity对象。 显然,如果集合为空,则所有Activity对象都不符合条件。

var result = context.Activity.Where(a => 
    statuses.Contains(a.StatusID) && priorities.Contains(a.PriorityID));

基于@Don Tomato的评论的替代答案
根据您提出问题的方式一定存在误解。 但是,我认为您想要的是根据需要向IQueryable添加条件。

List<Func<Activity, bool>> conditions = new List<Func<Activity, bool>>();
// add conditions to the list
// for eaxmple:
// conditions.add(a => statuses.Contains(a.StatusID));
// or 
// conditions.add(a => a.Name == "Don Tomato");

IQueryable query = context.Activity.AsQueryable();
foreach (Func<Activity, bool> condition in conditions)
   query = query.Where(condition);

List<Activity> result = query.ToList();

您可以像这样将where子句链接在一起,最终结果是将它们合并在一起:

var query = context.Activity.Where(o => <condition1>);

if (2ndconditionrequired)
{
    query = query.where(o => <condition2>);
}

query.ToList();

您也可以这样:

var result = context.Activity;

if (statuses != null && statuses.Count > 0)
{
    result = results.Where(a => 
        a.StatusID == statuses[0] || a.StatusID == statuses[1] || ... || a.StatusID == statuses[n];
}

if (priorities != null && priorities.Count > 0)
{
    result = results.Where(a => 
        a.PriorityID == priorities[0] || a.PriorityID == priorities[1] || ... || a.PriorityID  == priorities[m]);
}

result.ToList(); // The query won't be executed until here.

但是我想您真正想要做的就是@Bazzz回答。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM