C# EF中的多个where条件

C# EF中的多个where条件,c#,asp.net,linq,entity-framework,C#,Asp.net,Linq,Entity Framework,可能重复: 使用实体框架4.0 我有这样的搜索条件 有四个字段允许用户过滤他们的搜索。这些条件都是和。如果文本框值为String.Empty或dropdownlist值为All,则结果必须省略相应的过滤器。可以在存储过程中实现这一点,但我无法在Linq2SQL/实体框架场景中模拟这一点 我的问题是,如何省略IEnumerable。根据输入的一些值,Linq中的哪个位置?我认为跳过While和Take While可能对您的情况有所帮助 你可以这样做 var abc = from al in m

可能重复:

使用实体框架4.0

我有这样的搜索条件

有四个字段允许用户过滤他们的搜索。这些条件都是
。如果文本框值为
String.Empty
或dropdownlist值为All,则结果必须省略相应的过滤器。可以在存储过程中实现这一点,但我无法在Linq2SQL/实体框架场景中模拟这一点


我的问题是,如何省略IEnumerable。根据输入的一些值,Linq中的哪个位置?

我认为跳过While和Take While可能对您的情况有所帮助


你可以这样做

var abc = from al in myEntity.a
                  where (field == string.Empty ? al.field == string.Empty : al.field == field)
                  select new { al.field1, al.field2, al.field3 };

假设代码中的位置和类别由id标识(id是组合框项目中的value属性),则可以执行类似的操作

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)
    );
}
}

实现这一点的灵活方法是分别构建where子句

这篇文章向您展示了如何做到这一点。最初设置它需要一些工作。但这是值得的

看一看。它将允许您执行以下操作:

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);
}
IQueryable SearchProducts(参数字符串[]关键字)
{
var predicate=PredicateBuilder.True();
foreach(关键字中的字符串关键字)
{
字符串temp=关键字;
if(temp!=字符串.空| | temp!=“全部”)
谓词=谓词,且(e=>e.???包含(temp));
}
返回dataContext.??.Where(谓词);
}
注意:


您可以链接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....

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

您需要所有条件,包括String.Empty | dropdownList.Value=-1适合linq查询的条件?如果不是,您可以将其设为外部条件,然后将过滤条件适配到linq查询中。@mootinator:谢谢,我目前正在做类似的事情。这是唯一的出路吗?为什么这是件坏事?比起到处都有疯狂的布尔运算符,我更喜欢它。@RPM1984:一点也不坏。事实上,我们正在询问更好的选项:)多个
.Where()
也充当Where之间的AND。例如:
db.Where(x=>x.A==true)。Where(x=>x.B==true)
db.Where(x=>x.A==true&&x.B==true)
当你链接Where时,它们总是作为AND追加。性能如何?跨多个
where
子句拆分条件是否会导致开销?否,因为在查询具体化之前不会实际解析它。
因为它是可查询的,在绑定数据之前不会提取数据,因此它只提取您需要的数据。
这是非常重要的一行,应该放在任何有关EF查询的教程的顶部!