【发布时间】:2018-10-16 18:54:05
【问题描述】:
我正在使用实体框架核心 HasQueryFilter 方法,同时在此过滤器表达式中有一个动态变量。由于这个动态参数(让我们将其命名为“MinPriority”),我不能直接传递像
这样的 lambda 表达式HasQueryFilter(x => x.Priority >= Program.MinPriority);
作为过滤器,因为它编译并忽略对 MinPriority 的任何更改。这就是为什么我在每次调用时都会生成一个新函数,例如:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<GroupItem>().HasQueryFilter(x => GenerateMyFilter()(x));
}
protected Func<GroupItem, bool> GenerateMyFilter()
{
return x => x.Priority >= Program.MinPriority;
}
这对
来说很好用dbContext.GroupItems.ToList()
我还可以更改 MinPriority,并且此变量的更改由过滤器区域化。
但是当将此实体作为包含调用时,EF 核心会引发异常:
dbContext.Groups.Include(x => x.Items).ToList()
抛出 NullReferenceException:
at lambda_method(Closure , AnonymousObject )
at System.Linq.Lookup`2.CreateForJoin(IEnumerable`1 source, Func`2 keySelector, IEqualityComparer`1 comparer)
at System.Linq.Enumerable.JoinIterator[TOuter,TInner,TKey,TResult](IEnumerable`1 outer, IEnumerable`1 inner, Func`2 outerKeySelector, Func`2 innerKeySelector, Func`3 resultSelector, IEqualityComparer`1 comparer)+MoveNext()
at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source, Int32& length)
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.OrderedEnumerable`1.GetEnumerator()+MoveNext()
at System.Linq.Enumerable.SelectIPartitionIterator`2.MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.QueryBuffer.IncludeCollection[TEntity,TRelated,TElement](Int32 includeId, INavigation navigation, INavigation inverseNavigation, IEntityType targetEntityType, IClrCollectionAccessor clrCollectionAccessor, IClrPropertySetter inverseClrPropertySetter, Boolean tracking, TEntity entity, Func`1 relatedEntitiesFactory, Func`3 joinPredicate)
at lambda_method(Closure , QueryContext , Group , Object[] )
at Microsoft.EntityFrameworkCore.Query.Internal.IncludeCompiler._Include[TEntity](QueryContext queryContext, TEntity entity, Object[] included, Action`3 fixup)
at lambda_method(Closure , Group )
at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider._TrackEntities[TOut,TIn](IEnumerable`1 results, QueryContext queryContext, IList`1 entityTrackingInfos, IList`1 entityAccessors)+MoveNext()
at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
at System.Collections.Generic.List`1.AddEnumerable(IEnumerable`1 enumerable)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at EFCoreTest.Program.PrintGroups[TDbContext]()
我创建了一个简单的控制台应用程序,它会产生这个异常:https://gist.github.com/cyptus/f9ac8bb74b2a7d98d148326502600d40
有没有其他方法可以通过动态变量向 EF 核心 DbSet 提供查询过滤器?
【问题讨论】:
标签: c# entity-framework asp.net-core lambda entity-framework-core