直接在属性上应用表达式树逻辑?

时间:2014-06-23 19:03:13

标签: c# entity-framework ef-code-first expression-trees

我可能(甚至可能)我在这里混淆术语。那么让我解释一下这个想法......

目前我有一个实体框架6代码优先的方法,有一些持久性无知模型和IUnitOfWorkIEntityRepository的一些接口,它们抽象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表达式表示吗?

0 个答案:

没有答案