问题是这个,我在实体中有一个属性:
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)替换为属性,但这很荒谬(就可读性和复杂性而言)。
答案 0 :(得分:0)
只要我没有收到任何更好的答案,我就保持简单:将可重复使用的表达式移到存储库中。它可能看起来不那么干净,可能不是最好的地方,但是它们正在完成它们的工作并且不会带来额外的复杂性,所以我想这是一个非常好的解决方案。