【问题标题】:Removing the WHERE clause in a Linq query删除 Linq 查询中的 WHERE 子句
【发布时间】:2009-10-30 16:21:33
【问题描述】:

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

例如,其中三列描述了产品适用于各种市场的情况,即汽车、航空和船舶。

如果这些复选框都没有被选中,我希望执行以下 SQL。

SELECT * FROM Products

如果检查了 Automotive,则应执行以下 SQL

SELECT * FROM Products WHERE Automotive = 1

如果选中了多个,我希望将这些选项组合在一起

SELECT * FROM Products WHERE 
    Automotive = 1 
    OR 
    Aviation = 1

在良好的旧 C# 和 SQL 中,我可以通过有条件地将 SQL 连接在一起来实现此逻辑,但我无法使用 Linq 生成相同的逻辑。

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

我希望只有一个执行查询的点,因此,如果可能的话,我想避免使用 C# if 来分支到不同的查询。

【问题讨论】:

标签: c# linq linq-to-sql


【解决方案1】:

我会为此使用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 很漂亮!!
【解决方案2】:

将值设为“或”与“与”会使这个问题变得更加困难。如果它是“And”,那么以下应该没问题

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 子句。 stackoverflow.com/questions/1280871/… 似乎支持这一点。
  • 是的,但它们会在生成的 SQL 中形成“与”情况。您实际上是在执行 where A AND where B AND where C,而不是 where (A OR B OR C),因为这需要不同样式的 SQL 语句。
【解决方案3】:

如果您尝试将检查单个列的“或”语句组合在一起,您可以使用Contains 来完成此操作。这是一个good blog post,展示了它是如何工作的。

但是,如果您尝试动态检查不同的列,这将不起作用。在这种情况下,可能需要多个语句。

【讨论】:

    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多