EF中的多个条件

nav*_*een 22 c# linq asp.net entity-framework

可能重复:
条件Linq查询

使用Entity Framework 4.0

我有这样的搜索条件

在此输入图像描述

有四个字段允许用户过滤搜索.条件都是AND.如果文本框值为String.Empty或者下拉列表值为全部,则结果必须省略相应的过滤器.可以在存储过程中执行此操作,但我无法在Linq2SQL/Entity Framework方案中模仿这一点.

我的问题是这个,如何在Linq中根据一些输入值省略IEnumerable.Where?

Sli*_*k86 39

你可以链接你的where子句.您只需要一个IQueryable数据源.

var filteredData = _repository.GetAll();
//If your data source is IEnumerable, just add .AsQueryable() to make it IQueryable

if(keyWordTextBox.Text!="")
    filteredData=filteredData.Where(m=>m.Keyword.Contains(keyWordTextBox.Text));

if(LocationDropDown.SelectedValue!="All")
    filteredData=filteredData.Where(m=>m.Location==LocationDropDown.SelectedValue));

... etc....
Run Code Online (Sandbox Code Playgroud)

因为它是IQueryable,所以在绑定数据之前不会获取数据,因此它只会提取您需要的数据.

  • 性能如何?跨多个`where`子句的拆分条件会导致开销吗? (6认同)
  • 当你链接Wheres'时,它们总是附加为AND. (5认同)
  • 所以多个`.Where()`在where之间充当AND.例如:`db.Where(x => xA == true).Where(x => xB == true)`与`db.Where相同(x => xA == true && xB == true )` (4认同)
  • 不,因为在实现查询之前实际上并未对其进行解析. (4认同)
  • “因为它是 IQueryable,所以在绑定它之前不会提取数据,因此它只提取您需要的数据。” 这是非常重要的一行,应该位于任何处理 EF 查询的教程的顶部! (4认同)

Luc*_*ian 8

假设您的代码中的位置和类别由ID标识(id是组合框项目中的值属性),您可以执行类似于

function GetItems(string keyword, string consultant, int? locationId, int categoryId){

using(MyContextEntities context = new MyContextEntities()){
    return context.Items.Where(item => 
        (string.IsNullOrEmpty(keyword) || item.Text.Contains(keyword))
        && (string.IsNullOrEmpty(consultant) || item.Consultant.Contains(consultant))
        && (!locationId.HasValue || item.Location.Id == locationId.Value)
        && (!categoryId.HasValue || item.Category.Id == categoryId.Value)
    );
}
}
Run Code Online (Sandbox Code Playgroud)


Sim*_*sen 7

看看PredicateBuilder.它允许你做这样的事情:

IQueryable<??> SearchProducts (params string[] keywords)
{
  var predicate = PredicateBuilder.True<??>();

  foreach (string keyword in keywords)
  {
    string temp = keyword;
    if(temp != String.Empty || temp != "All")
          predicate = predicate.And(e => e.???.Contains (temp));
  }
  return dataContext.??.Where (predicate);
}
Run Code Online (Sandbox Code Playgroud)