C# 实体框架4.1属性,具有用于查询的逻辑
问题是,我在实体中有一个属性:C# 实体框架4.1属性,具有用于查询的逻辑,c#,entity-framework,entity-framework-4,entity-framework-4.1,C#,Entity Framework,Entity Framework 4,Entity Framework 4.1,问题是,我在实体中有一个属性: public bool Expired { get { return CreationDate.AddDays(30) < DateTime.UtcNow; } } 更新: 哦,在发布问题后,我在谷歌上又尝试了几次查询,结果发现: 它需要一些额外的代码,所以我使用前面提到的库为我的属性编写了CompiledExpression: private static readonly Compil
public bool Expired
{
get { return CreationDate.AddDays(30) < DateTime.UtcNow; }
}
更新:
哦,在发布问题后,我在谷歌上又尝试了几次查询,结果发现:
它需要一些额外的代码,所以我使用前面提到的库为我的属性编写了CompiledExpression:
private static readonly CompiledExpression<GuaranteeTransaction, bool> ShouldBeExpiredExpression =
DefaultTranslationOf<GuaranteeTransaction>
.Property(x => x.ShouldBeExpired)
.Is(x => x.CreationDate < DateTime.UtcNow.AddDays(-30));
private static readonly CompiledExpression应该是expiredexpression=
默认翻译
.Property(x=>x.ShouldBeExpired)
.Is(x=>x.CreationDate
事实证明,实体框架也不支持AddDays。我想我可以使用相同的机制创建另一个CompiledExpression来替换DateTime.UtcNow.AddDays(-30)属性,但那将是荒谬的(就可读性和复杂性而言)。只要我没有收到任何更好的答案,我就保持简单:将可重用表达式移动到存储库。它可能看起来不那么干净,也可能不在最佳位置,但他们正在做他们的工作,没有带来额外的复杂性,所以我想这是一个很好的解决方案。它甚至没有尝试-只是EF没有尝试,因为它需要评估属性内编译指令的含义。编译代码和表达式树之间有很大的区别。您是否尝试过在表达式外部获取
DateTime.UtcNow.AddDays
,然后将值传递到表达式中?此外,我还发现了一些类似的代码,使您能够逐段构建查询。它可能会帮助你解决你的问题。查看我对这个问题的回答:
private static readonly CompiledExpression<GuaranteeTransaction, bool> ShouldBeExpiredExpression =
DefaultTranslationOf<GuaranteeTransaction>
.Property(x => x.ShouldBeExpired)
.Is(x => x.CreationDate < DateTime.UtcNow.AddDays(-30));