在 Linq 查询中删除 WHERE 子句

3

我有一个产品信息表,其中有许多位列。可以从界面查询此表,界面上每个列都有一个复选框。这些复选框分为几个相关的组。

例如,三个列描述了产品适用于各种市场,包括汽车、航空和海洋。

如果没有选中任何这些复选框,则希望执行以下SQL语句。

SELECT * FROM Products

如果勾选了“汽车”,则应执行以下SQL语句。
SELECT * FROM Products WHERE Automotive = 1

如果选中了多个复选框,我希望选项之间是“或”的关系。
SELECT * FROM Products WHERE 
    Automotive = 1 
    OR 
    Aviation = 1

在经典的C#和SQL中,我可以通过有条件地连接SQL来实现此逻辑,但是我在使用Linq时遇到了麻烦。

我的问题是如何有条件地将WHERE子句及其元素添加到查询中。

如果可能的话,我更喜欢仅有一个查询执行点,因此想避免使用C#的if语句来分支到不同的查询。


这对您有帮助吗?http://stackoverflow.com/questions/1450983/linq2sql-or-and-operators-anded-ored-conditions - Partha Choudhury
3个回答

6

对于这个问题,我会使用PredicateBuilder

var query = db.GetTable<Products>().AsQueryable();

var predicate = PredicateBuilder.False<Products>();
if (automotive.Checked)
{
    predicate = predicate.Or( p => p.Automotive == 1 );
}
if (aviation.Checked) 
{
    predicate = predicate.Or( p => p.Aviation == 1 );
}
query = query.Where( predicate );

没错!这个PredicateBuilder真是太棒了!! - Greg B

3

将值设为“或”与“与”相比,会使这个问题变得更加困难。如果是“与”,那么以下内容应该可以胜任

public IEnumerable<Products> GetQuery() {
  var query = db.GetTable<Products>();
  if ( automotiveBox.Checked ) {
    query = query.Where(x => x.Automotive == 1);
  }
  if ( aviation.Checked ) {
    query = query.Where(x => x.Aviation == 1);
  }
  return query
}

由于这是一个“或”条件,我认为您唯一的选择是手动构建表达式树并将其用作Where子句。


这对“或”情况不起作用吗?我相信多个Where条件将在生成的SQL中简单地组合成一个Where子句。http://stackoverflow.com/questions/1280871/multiple-defered-where-clause-expressions-in-linq-to-sql 似乎支持这一点。 - Chris Shouts
1
是的,但它们将在生成的SQL中形成一个“AND”条件。实际上,您正在执行where A AND where B AND where C,而不是where(A OR B OR C),因为那需要一种不同样式的SQL语句。 - Reed Copsey

3
如果您想将检查单个列的“OR”语句连接在一起,可以使用Contains来实现。这里有一篇好的博客文章,展示了如何使用它。
然而,如果您想动态检查不同的列,这种方法将无法奏效。在这种情况下,可能需要多个语句来完成任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接