繁体   English   中英

删除Linq查询中的WHERE子句

[英]Removing the WHERE clause in a Linq query

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

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

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

SELECT * FROM Products

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

SELECT * FROM Products WHERE Automotive = 1

如果检查了多个,我希望选项一起进行OR运算

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

在古老的C#和SQL中,我可以通过有条件地将SQL结合在一起来实现这个逻辑,但是我在使用Linq生成相同的逻辑时遇到了麻烦。

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

我更喜欢只有一个点执行查询,所以,如果可能的话,我想避免使用C#, 如果要分支到不同的查询。

我会为此使用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 );

将值设为“Or”与“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子句。

如果您尝试将“OR”语句放在一起检查单个列,则可以使用Contains来完成此操作。 这是一篇很好的博客文章,展示了它的工作原理。

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

暂无
暂无

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

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