如何从不同的 DbSet 实体获取数据并合并到一个对象中

本文关键字:数据 合并 一个对象 获取 实体 DbSet | 更新日期: 2023-09-27 18:36:22

当我Entity Framework 6DbContextIQueryable<T>时,使用来自其他DbSet实体的其他数据创建一个或多个对象的最有效方法是什么?

下面是一些代码:

如果我有一个Data类,如下所示:

public class Data
{
    [Key]
    public int id { get; set; }
    public string name { get; set; }
    public string data { get; set; }
    public int parentId { get; set; }
    public int otherDataId { get; set; }
}

以及一个OtherData类,如下所示:

public class OtherData
{
    [Key]
    public int id { get; set; }
    public string name { get; set; }
    public string data { get; set; }
}

Data类中,parentId是对同一DbSet中另一个Data对象的外键引用,而otherDataId是对DbSet<OtherData>OtherData对象的外键引用。

我想获取DbSet<Data>中的所有Data对象,以及父对象Data idname的附加DbSet数据以及OtherData对象的idname。我需要将其放在一个对象中,以便从网络服务 GET 发送。

我不确定如何做到这一点。

我是否需要一些代码,如下所示:

var result = DbContext.Data.Select(x=> x...).Join(y=> y...) .. new { id = x.id... y.name.. }

我可以对此代码提供一些帮助吗?

如何从不同的 DbSet 实体获取数据并合并到一个对象中

您可以使用联接并投影结果。在下面的代码片段中,CombinedData 是另一个类,具有 2 个字符串字段 Name 和 OtherName。您也可以使用视图,但我认为加入工作量更少。

IQueryable<CombinedData> result = DbContext.Data.Join(
    DbContext.Data.DbContext.OtherData, 
    outer => outer.OtherDataId, 
    inner => inner.Id), 
    (outer, inner) => new { Name = outer.Name, OtherName = inner.Name} 
);

根据您的整体架构,这可能是一个好答案或坏答案,但过去遇到这种情况时,我们的团队通常会在数据库中创建一个view来组合字段。在视图中编写优化的查询,然后将其视为数据层中的任何其他表。

您可以使用包含或联接甚至跨表查询中写出表达式来实现相同的最终结果,但在我看来,视图是最干净、最有效的方法。