C# 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

我在使用带EF核心的LinqKit时遇到了一个奇怪的行为

这是我的疑问:

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));
}