如何在 IEnumerable 和 IQueryable 之间进行 DRY 查询逻辑?
How do I DRY query logic between IEnumerable and IQueryable?
给定两个实体 EntityOne
和 EntityTwo
:
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>>
。
给定两个实体 EntityOne
和 EntityTwo
:
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>>
。