我可能(甚至可能)我在这里混淆术语。那么让我解释一下这个想法......
目前我有一个实体框架6代码优先的方法,有一些持久性无知模型和IUnitOfWork
和IEntityRepository
的一些接口,它们抽象DbContext
和{{1} } 分别。当然,它通过流畅的映射语法“连接”到数据库。因此对于DbSet<Entity>
模型上的子对象:
Entity
我会有一个映射,例如:
public IList<Field> Fields { get; set; }
同样的父/子关系会继续通过HasMany(e => e.Fields)
.WithRequired(f => f.Entity)
.HasForeignKey(f => f.EntityId)
.WillCascadeOnDelete(false);
聚合根下的大量对象图。通常在应用程序中我发现我需要因各种原因迭代子对象。当我这样做时,我经常不得不忽略某些元素(例如,软删除的元素),这意味着我将从数据库中实现我不需要的记录。
所以我想知道(到目前为止我的搜索/修补没有找到解决方案)是否有任何方法可以将某种逻辑直接应用于字段映射,这会导致在懒惰时导致DB端过滤 - 加载该属性。最简单的是,在上面的流畅映射中描绘一个Entity
子句。
例如,我可能在.Where()
模型上将表达式树作为静态属性:
Field
如果我直接在public static Expression<Func<Field, bool>> IsActive =
f => f.Versions.OrderByDescending(v => v.VersionDate)
.FirstOrDefault.IsActive == true;
.Where()
子句中使用它,它可能看起来像:
DbSet<Field>
然后,当数据实现时,表达式树逻辑应用于DB端,使整个事情对数据库不那么健谈。这可能是模型上的一个单独属性:
var activeFields = db.Fields.Where(Field.IsActive);
每个都有自己的映射。可以将附加逻辑映射到其他字段。理想情况下,这里的重点是尽可能多地将查询逻辑卸载到数据库中。也许有一些技术可以在Entity Framework中创建计算字段,将逻辑卸载到数据库中,前提是逻辑可以用Linq To Entities表达式表示吗?