首页 > 解决方案 > 具有最大子记录属性的实体框架模型

问题描述

我有几个具有父子关系的简单 EF 模型。子项本质上是审计记录。我想使用审计来获取最小日期来确定父级的“创建日期”。

这两个模型直接匹配 SQL 数据库,正如您所期望的那样,除了派生的“CreatedDate”字段,我希望 EF 将其转换为简单的“Max”子查询。

我正在将 EF 存储库模式与工作单元模式一起使用,并试图通过 SQL Server 执行 MAX 查询来使事情变得非常简单。

我曾尝试使用 automapper 在我的服务层中进行映射,但这会为每个父级生成一个 SQL 查询。

有任何想法吗?

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual IEnumerable<Audit> Audits { get; set; }

    //Read only create date and problem property
    [NotMapped]
    public DateTime CreatedDate
    {
        get
        {
            return Audits.Max(a => a.AuditDate);
        }
    }
}

public class Audit
{
    public int Id { get; set; }
    public int ItemId { get; set; }
    public DateTime AuditDate { get; set; }
}

标签: entity-framework

解决方案


我很可能是错的,但我认为 EF 不会支持这一点;要么你提取一个项目的所有审计记录,例如

var item = _context.Items.Include("Audit").FirstOrDefault(i=>i.Id==1)

在这种情况下,该方法将起作用。

或者,您可以创建一个映射到仅包含 Id、Name 和 CreateDate 的新实体(或 QueryType,如果您使用的是 EF Core)的视图。

例如

SELECT Id,Name=CreateDate=Max(CreateDate) from Items group by Id,Name

现在,由于我总是对这类事情使用视图,所以我确实在第一点上得到纠正!


推荐阅读