1

我正在寻找一个优雅的、可重复使用的解决方案来解决困扰我多年的问题。因此,

假设我在整个网站上都使用了一些业务逻辑:(不要对这有多简单,它可能很复杂)

public DateTime ExpiryDate
{
   get { return DateAdded.Date.AddMonths(ApplicationConfiguration.Rule3ExpiryLengthInMonths); }
}

还有一个 Linq 声明:

groupedByPatient.Count(x =>
                        x.Max(a => System.Data.Objects.EntityFunctions.AddMonths(a.DateAdded, ApplicationConfiguration.Rule3ExpiryLengthInMonths))
                        <= DateTime.Now);

这个“过期”的逻辑必须重复,因为(可以理解)过期不是数据库中的一列。最终结果是我们最终在代码中出现了分散的业务逻辑。理想情况下,我们会:

var count = groupedByPatient.Count(x =>
                        x.Max(a => a.ExpiryDate)
                        <= DateTime.Now);

从理论上讲,只要您符合 Linq 的“c#”规则,您就应该能够抽象出这段代码,比如:

public DateTime ExpiryDate
    {
        get { return System.Data.Objects.EntityFunctions.AddMonths(
                DateAdded, ApplicationConfiguration.Rule3ExpiryLengthInMonths).D }
    }
4

2 回答 2

0

我不确定这个主题与你输入的代码示例,但我很确定这里的第二个就是你要找的。

如果您只想要物化查询的结果(即在您获得数据之后),请使用扩展:

public static string ToExpiryDate(this DateTime date) 
{
    return date.AddMonths(ApplicationConfiguration.Rule3ExpiryLengthInMonths);
}

如果您想要 IQueryable 中的结果(您的主题是我认为您正在寻找的),那么您可以使用表达式:

public static Expression<Func<IEnumerable<YourEntity>, DateTime>> MaxExpiryDate = (y) => y.Max(
   System.Data.Objects.EntityFunctions.AddMonths(y.DateAdded, ApplicationConfiguration.Rule3ExpiryLengthInMonths)
);

然后您的查询将如下所示:

var count = groupedByPatient.Count(x => x.YourEntities(MaxExpiryDate) <= DateTime.Now);

注意:Func<> 必须包含在 Expression<> 中,即使两者似乎都可以工作,如果不将其包装在表达式中,查询将在运行之前强制实现。通过在函数周围放置表达式,我们告诉 EF 将其作为查询的一部分。

于 2013-05-17T00:33:15.137 回答
0

为什么不在上创建扩展方法DateTime?这样,只要您有一个日期,您就可以调用它来获取您的到期日期:

static class DateTimeExtensions
{
    public static DateTime ExpiryDate(this DateTime dte)
    {
        return dte.AddMonths(ApplicationConfiguration.Rule3ExpiryLengthInMonths);
    }
}

如果我正确理解了您的示例,DateAdded则表中的日期列是您希望从中找到到期日期的日期。然后,只需这样做:

var count = groupedByPatient.Count(x => 
                         x.Max(a => a.DateAdded.ExpiryDate()) <= DateTime.Now);
于 2013-05-17T00:27:53.040 回答