binbin ling predicatebuilder尝试将AND(field1 = string1或field1 = string2)添加到谓词结尾

时间:2014-08-20 06:20:43

标签: entity-framework predicate predicatebuilder

我正在使用bin bin predicatebuilder并且有一个查询工作,但是当使用.contains时它非常慢,我需要它来进行精确匹配而不是包含,因为当我直接在sql server上测试时它会产生更快的查询。理想情况下,我希望能够加入2个谓词。

这就是我之前所拥有的。

  Expression<Func<MyModel, bool>> filter = null;
    var predicate = PredicateBuilder.True<MyModel>();

然后我检查一系列可能的过滤值,如下所示:

if(!.string.IsNullOrEmpty(filterVal1))
    predicate = predicate.And(x=>x.someField = filterVal1)
if(!.string.IsNullOrEmpty(filterVal2))
  predicate = predicate.And(x=>x.someOtherField = filterVal2)

等等我构建它然后将它分配给我的过滤器,它将它传递给我的搜索功能,它正确地检索所有数据(我在那里做了filter.Expand())。

所有工作正常,除非我想检查特定字段中的多个字符串值,EF生成的代码非常有问题并且有很多嵌套会减慢它的速度。这就是我在谓语中的含义:

if (!string.IsNullOrEmpty(listOfValues))
   predicate = predicate.And(x => listOfValuesArray.Contains(x.someField.ToString()));

但如果我硬编码这种测试: predicate.And(x =&gt; x.someField ==&#34; listOfValuesArray1&#34; || x.someField ==&#34; listOfValuesArray1&#34;);等等,EF产生的查询要好得多,而且一切都快速运行。

所以我需要能够使上面的硬编码查询动态,因为我有一个数组/列表f字符串值,我需要在一个特定字段中检查为AND(field = value1或field = value2 ... field =值N)

我试图创建2个谓词并使用AND(predicate1,predicate2)加入它们但我得到一个实体框架错误,告诉我使用我已经使用的Expand()。 我也尝试了Comnpile()谓词。

任何帮助非常感谢 感谢

0 个答案:

没有答案