我有一个包含许多位列的产品信息表。可以从具有每列复选框的界面查询此表。复选框分为几个相关组。
例如,其中三列描述了产品适用于各种市场,包括汽车,航空和海运。
如果没有选中这些复选框,我希望执行以下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#,如果分支到不同的查询。
答案 0 :(得分: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 );
答案 1 :(得分:3)
将值设为“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子句。
答案 2 :(得分:3)
如果您尝试一起检查单个列的“OR”语句,则可以使用Contains来完成此操作。这是good blog post,显示了它的工作原理。
但是,如果您尝试动态检查不同的列,则无效。在这种情况下,可能需要多个语句。