实体框架4.1属性,包含用于查询的逻辑

时间:2011-11-02 09:32:27

标签: c# entity-framework entity-framework-4 entity-framework-4.1

问题是这个,我在实体中有一个属性:

    public bool Expired
    {
        get { return CreationDate.AddDays(30) < DateTime.UtcNow; }            
    }

当然我不能在实体框架查询中使用它,虽然它不包含EF无法处理的任何东西,只是它甚至没有尝试。

问题是,是否有可能在实体中以某种方式将这些小型查询作为属性(例如使用Func<T, bool>)重新用于形成更复杂的查询,例如

Products.Where(x.Expired || x.Price > something)

更新: 哦,在发布问题之后,我在谷歌上尝试了几个查询并发现了这个:

http://damieng.com/blog/2009/06/24/client-side-properties-and-any-remote-linq-provider

它需要一些额外的代码,所以我使用上面提到的库为我的属性写了CompiledExpression:

 private static readonly CompiledExpression<GuaranteeTransaction, bool> ShouldBeExpiredExpression =
        DefaultTranslationOf<GuaranteeTransaction>
        .Property(x => x.ShouldBeExpired)
        .Is(x => x.CreationDate < DateTime.UtcNow.AddDays(-30));

事实证明,实体框架也不支持AddDays。我想我可以使用相同的机制创建另一个CompiledExpression来将DateTime.UtcNow.AddDays(-30)替换为属性,但这很荒谬(就可读性和复杂性而言)。

1 个答案:

答案 0 :(得分:0)

只要我没有收到任何更好的答案,我就保持简单:将可重复使用的表达式移到存储库中。它可能看起来不那么干净,可能不是最好的地方,但是它们正在完成它们的工作并且不会带来额外的复杂性,所以我想这是一个非常好的解决方案。