Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架4.1属性,具有用于查询的逻辑_C#_Entity Framework_Entity Framework 4_Entity Framework 4.1 - Fatal编程技术网

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));