如何从不同的 DbSet 实体获取数据并合并到一个对象中
本文关键字:数据 合并 一个对象 获取 实体 DbSet | 更新日期: 2023-09-27 18:36:22
当我Entity Framework 6
有DbContext
或IQueryable<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
id
和name
的附加DbSet
数据以及OtherData
对象的id
和name
。我需要将其放在一个对象中,以便从网络服务 GET 发送。
我不确定如何做到这一点。
我是否需要一些代码,如下所示:
var result = DbContext.Data.Select(x=> x...).Join(y=> y...) .. new { id = x.id... y.name.. }
我可以对此代码提供一些帮助吗?
您可以使用联接并投影结果。在下面的代码片段中,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
来组合字段。在视图中编写优化的查询,然后将其视为数据层中的任何其他表。
您可以使用包含或联接甚至跨表查询中写出表达式来实现相同的最终结果,但在我看来,视图是最干净、最有效的方法。