我正在使用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()谓词。
任何帮助非常感谢 感谢