如何在 IEnumerable 和 IQueryable 之间进行 DRY 查询逻辑?

How do I DRY query logic between IEnumerable and IQueryable?

给定两个实体 EntityOneEntityTwo:

public class EntityOne
{
    public string Title { get; set; }
    public bool IsSomething { get; set; }
}
public class EntityTwo
{
    ...

    public virtual IEnumerable<EntityOne> EntityOnes { get; set; }
}

和一个 EntityOneFilter 对象,例如:

public class EntityOneFilter
{
    public EntityOneFilter(string? query, bool? isSomething, ...)
    {
        ...
    }
    
    public string? Query { get; }
    public bool? IsSomething { get; }
}

我想重用可应用于 IEnumerable<EntityOne>IQueryable<EntityOne> 的查询逻辑:

(filter.Query == null || EF.Functions.Like(entity.Title, $"%{filter.Query}%"))
    && (!filter.IsSomething.HasValue || entity.IsSomething == filter.IsSomething.Value)
    && ...

以便它可以应用于来自 DbContext 的两个 IQueryable:

dbContext.EntityOnes.Where(<something with filter>).FirstAsync();

以及 IEnumerable<EntityOne> 显示为 EntityTwo:

的一对多集合
dbContext.EntityTwos
    .Where(e2 => e2.EntityOnes.Where(<something with filter>).Any())
    .FirstAsync();

我怎样才能做到这一点?

正如评论中所建议的,我只需要使用:

dbContext.EntityTwos
    .Where(e2 => e2.EntityOnes
        .AsQueryable()
        .Where(expression).Any())
    .FirstAsync();

其中 expression 是一个 Expression<Func<EntityOne, bool>>