C# LinqKit通过扩展方法应用嵌套筛选无效
我在使用带EF核心的LinqKit时遇到了一个奇怪的行为 这是我的疑问:C# LinqKit通过扩展方法应用嵌套筛选无效,c#,entity-framework-core,linq-to-entities,linqkit,C#,Entity Framework Core,Linq To Entities,Linqkit,我在使用带EF核心的LinqKit时遇到了一个奇怪的行为 这是我的疑问: var divisionFilter = new DivisionFilter { VisibilityFilter = (DivisionVisibilityFilter)true }; await DbContext.Events.Get(new EventFilter { IsVisibleFilter = (EventIsVisibleFilter)true, IdIncludeExclu
var divisionFilter = new DivisionFilter
{
VisibilityFilter = (DivisionVisibilityFilter)true
};
await DbContext.Events.Get(new EventFilter
{
IsVisibleFilter = (EventIsVisibleFilter)true,
IdIncludeExcludeFilter = (EventIdIncludeExcludeFilter)new IncludeExcludeFilter<Guid> { Includes = new[] { eventId } }
}).Select(e => new
{
Divisions = e.Divisions
.Get(divisionFilter) // throws excepetion
.Where(d2 => divisionFilter.FilterExpression.Expand().Invoke(d2)) // works fine
.Select(division => new
{
division.DivisionId,
division.DivisionName,
division.DivisionGender
})
}).SingleAsync()
而第一个将AsExpandable
应用于顶部表格,第二个用于过滤嵌套的导航属性
但是,如果对嵌套属性使用Get
,则会引发异常
无法翻译LINQ表达式“division”
它来自Select
-子句
如果我直接使用Where
-子句并添加Expand().Invoke(d2)
,它将按预期工作,但在使用扩展时不会工作。
在我看来,两个调用都是相同的,但很明显,它们不是,我不知道问题出在哪里。您必须将
Get
方法标记为可扩展:
[Expandable(name(GetEnumerable))]
公共静态IEnumerable Get(此IEnumerable实体,TEntityFilter筛选器)
其中tenty:BaseEntity,new()
其中tentyfilter:EntityFilter
{
返回entities.Where(e=>filter.filtereexpression.Expand().Invoke(e));
}
私有静态表达式GetEnumerablet()
{
返回(实体、过滤器)=>
其中(e=>filter.FilterExpression.Expand().Invoke(e));
}
public static IQueryable<TEntity> Get<TEntity, TEntityFilter>(this DbSet<TEntity> dbSet, TEntityFilter filter)
where TEntity : BaseEntity<TEntity>, new()
where TEntityFilter : EntityFilter<TEntity>
{
return dbSet.AsExpandable().Where(entity => filter.FilterExpression.Invoke(entity));
}
public static IEnumerable<TEntity> Get<TEntity, TEntityFilter>(this IEnumerable<TEntity> entities, TEntityFilter filter)
where TEntity : BaseEntity<TEntity>, new()
where TEntityFilter : EntityFilter<TEntity>
{
return entities.Where(e => filter.FilterExpression.Expand().Invoke(e));
}