Entity framework 如何编写可以在LinqToEntities中执行而无需加载对象的函数

Entity framework 如何编写可以在LinqToEntities中执行而无需加载对象的函数,entity-framework,linq-to-entities,Entity Framework,Linq To Entities,我有一个设计问题,但不知道如何解决它。我有一个策略对象,具有如下布尔属性: public bool IsCancelled { get { return (CancellationDate != null && Convert.ToDateTime(CancellationDate) < DateTime.Today); } } …LinqToEntities无法对数据库执行此操作;我必须将每个策略对象加载到内存中,如下所示,这会降

我有一个设计问题,但不知道如何解决它。我有一个策略对象,具有如下布尔属性:

public bool IsCancelled
{
    get
    {
        return (CancellationDate != null && Convert.ToDateTime(CancellationDate) < DateTime.Today);
    }
}
…LinqToEntities无法对数据库执行此操作;我必须将每个策略对象加载到内存中,如下所示,这会降低性能,而且完全没有必要:

context.policies.ToList().where(q => q.IsCancelled)
一位同事告诉我,我应该能够使用Func或表达式来实现这一点,但我不知道谷歌应该用什么短语来实现这一点。有人能推荐一两个链接来解释如何做到这一点吗

请记住,我希望它可以用于上面的查询,也可以用于内存中策略对象的实例,而无需对逻辑进行两次编码(DRY等)


谢谢。

问题在于转换方法。我假设CancelationDate是一个字符串。这里真正的问题是SQL不作为字符串进行日期比较,它们需要采用日期格式。这无法转换为SQL,因此在数据库中不起作用

您确实应该将日期存储为日期类型,而不是字符串。那么这将是微不足道的。如果你能改变这一点,那么就去做,那么就不需要转换

您的另一个选择是使用EntityFunctions、SqlFunctions和DbFunctions来尝试使其工作

请参阅:

您是否有可能将数据库中的类型更改为datetime?这是非常低效的。它是一个可为空的日期时间。我的问题不是具体的日期时间检查;它是关于检查任何自定义属性,比如我的IsCancelled属性(它的内容可以很容易地直接编码到我的LINQ语句中,但这违反了DRY原则)。它是一个可为空的日期时间。我的问题不是具体的日期时间检查;它是关于检查任何自定义属性,如我的IsCancelled属性(其内容可以很容易地直接编码到我的LINQ语句中,但这违反了DRY原则)。@JamesinIndy-这真的很简单。。。您的代码能否在SQL语句中执行?如果你看不出这是怎么可能的,那么不。。。这是行不通的。如果可能的话,那么可能在某个地方有一个Linq enable函数来实现它(如前面提到的Sql和DBF函数)。您不能简单地将.NET代码注入LinqToEntities语句并使其工作,除非它可转换为SQL。在EF7中,他们将提供一种更容易做到这一点的方法,但它仍然需要翻译到内存中,这将只是比目前更有效一点。
context.policies.ToList().where(q => q.IsCancelled)