添加或linq查询

时间:2017-11-21 07:41:31

标签: c# linq

可以在声明后添加或查询linq查询吗?

我的意思是,如果我有:

Query.Where(f => some-condition ); 

我想添加" OR"之后:

if (some-condition) 
   Query.WhereOr(f => some-condition ); 

3 个答案:

答案 0 :(得分:1)

看起来您可能正在寻找Predicate builder 或者你可以叠加一些.Where子句,因为linq是懒惰的。

由于你的问题缺乏上下文,想象一下根据一个表格查询一个Person表(2个字段/ 1个复选框)。

// Where Stacking
if (!string.IsNullOrEmpty(FieldA.Text))
{// OR
    result = query.Where(item => item.Something.Contains(FieldA.Text));
}
if (!string.IsNullOrEmpty(FieldB.Text))
{// AND
    result = result.Where(item => item.SomethingElse.Contains(FieldB.Text));
}

// Predicate
if (CheckBox1.Checked || CheckBox2.Checked || CheckBox3.Checked))
{//Here your initialise your predicate to false because you are going to do OR
    var predicate = PredicateBuilder.False<SearchItem>();
    if(CheckBox1.Checked) predicate = predicate.Or(item => item.Foo == 1);
    if(CheckBox2.Checked) predicate = predicate.Or(item => item.Foo == 2);
    if(CheckBox3.Checked) predicate = predicate.Or(item => item.Foo == 3);
    result = result.Where(predicate);
}

堆叠哪里是一个好的解决方案,但可能产生一点点过热,但没有什么是真正值得注意的。

PS:Jon关于嵌套https://codeblog.jonskeet.uk/2011/06/16/linq-to-objects-and-the-performance-of-nested-quot-where-quot-calls/

的文章

答案 1 :(得分:0)

您应该使用LinqKit.PredicateBuilder类

示例:

var predicate = PredicateBuilder.True<Product>();
if(inputPrice > 100)
   predicate = predicate.And (p => p.Price > 100);
if(inputName == "S%")
   predicate = predicate.And (p => p.Name.StartsWith("S"));

最后,

var result = products.Where(predicate);

更多详情Wiki

答案 2 :(得分:0)

IEnumerable和IQueryable在某种程度上将允许你链条件

Query.Where(f=> some-condition || some_other_condition);
// or
var q = Query.Where(f=> some-condition)
if(stuff_needs_to_happen)
  q = q.Where(f => stuff_that_needs_to_happen)

&#34;在某种程度上的原因&#34;使用IQueryable时,基础查询语言可能不支持谓词中的某些条件(自定义函数等)。