C#PredicateBuilder实体:参数'f'没有绑定在指定的LINQ to Entities查询expression式中

我需要build立一个dynamic的filter,我想继续使用实体。 因为这个原因我想用albahari的PredicateBuilder。

我创build了以下代码:

var invoerDatums = PredicateBuilder.True<OnderzoeksVragen>(); var inner = PredicateBuilder.False<OnderzoeksVragen>(); foreach (var filter in set.RapportInvoerFilter.ToList()) { if(filter.IsDate) { var date = DateTime.Parse(filter.Waarde); invoerDatums = invoerDatums.Or(o => o.Van >= date && o.Tot <= date); } else { string temp = filter.Waarde; inner = inner.Or(o => o.OnderzoekType == temp); } } invoerDatums = invoerDatums.And(inner); var onderzoeksVragen = entities.OnderzoeksVragen .AsExpandable() .Where(invoerDatums) .ToList(); 

当我运行代码时,只有一个filter不是datefilter。 所以只有内在谓词被填充。 当谓词执行时,我得到以下错误。

参数'f'没有绑定在指定的LINQ to Entities查询expression式中。

在search答案时,我find了以下页面 。 但是这已经在LINQKit中实现了。

有没有其他人遇到这个错误,并知道如何解决它?

我遇到了同样的错误,这个问题似乎是我用PredicateBuilder做出的谓词,而PredicateBuilder是由PredicateBuilder做的其他谓词组成的

例如(A或B)和(X或Y),其中一个构build者创buildA或B,一个创buildX或Y,第三个将他们连接在一起。

只有一个级别的谓词AsExpandable工作正常,当多个级别被引入时,我得到了同样的错误。

我无法find任何帮助,但通过一些试验和错误,我能够得到的东西工作。 每次我调用一个谓词时,我都用Expand扩展方法跟着它。

下面是一些简单的代码:

 public static IQueryable<Submission> AddOptionFilter( this IQueryable<Submission> query, IEnumerable<IGrouping<int, int>> options) { var predicate = options.Aggregate( PredicateBuilder.False<Submission>(), (accumulator, optionIds) => accumulator.Or(ConstructOptionMatchPredicate(optionIds).Expand())); query = query.Where(predicate.Expand()); return query; } 

Query是一个已经有AsExpandable调用的IQueryable,ConstructOptionNotMatchPredicate返回一个Expression。

一旦我们得到了错误,我们当然可以在运行时针对entity framework构build复杂的filter。

编辑:

由于人们仍在评论和投票,我认为它仍然是有用的,所以我正在共享另一个修复程序。 基本上我已经停止使用LinqKit,它的谓词构build器支持这个通用谓词生成器 ,它具有相同的API,但不需要扩展调用,值得一试。

我得到这个错误,Mant101的解释给了我答案,但是你可能正在寻找一个更简单的例子来解决这个问题:

 // This predicate is the 1st predicate builder var predicate = PredicateBuilder.True<Widget>(); // and I am adding more predicates to it (all no problem here) predicate = predicate.And(c => c.ColumnA == 1); predicate = predicate.And(c => c.ColumnB > 32); predicate = predicate.And(c => c.ColumnC == 73); // Now I want to add another "AND" predicate which actually comprises // of a whole list of sub-"OR" predicates if(keywords.Length > 0) { // NOTICE: Here I am starting off a brand new 2nd predicate builder.... // (I'm not "AND"ing it to the existing one (yet)) var subpredicate = PredicateBuilder.False<Widget>(); foreach(string s in keywords) { string t = s; // s is part of enumerable so need to make a copy of it subpredicate = subpredicate.Or(c => c.Name.Contains(t)); } // This is the "gotcha" bit... ANDing the independent // sub-predicate to the 1st one.... // If done like this, you will FAIL! // predicate = predicate.And(subpredicate); // FAIL at runtime! // To correct it, you must do this... predicate = predicate.And(subpredicate.Expand()); // OK at runtime! } 

希望这可以帮助! 🙂