使用Entity Framework 6
时,当我有DbSet
或DbContext
时,如何使用来自其他IQueryable<T>
实体的其他数据创建一个或多个对象的最有效方式?
以下是一些代码:
如果我有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
是对同一Data
中另一个DbSet
对象的外键引用,otherDataId
是外来的OtherData
中DbSet<OtherData>
对象的关键引用。
我想获取Data
中的所有DbSet<Data>
个对象,以及父DbSet
个对象Data
和{{1}的其他id
数据和} name
对象&{39} OtherData
和id
。我需要将它放在一个从Web服务GET发送的对象中。
我不确定如何做到这一点。
我是否需要一些代码:
name
我可以帮助您使用此代码吗?
答案 0 :(得分:1)
您可以使用联接并投射结果。在下面的代码段中,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}
);
答案 1 :(得分:0)
根据您的整体架构,这可能是一个好的或坏的答案,但通常在过去遇到此问题时,我们的团队会在数据库中创建view
来组合字段。在视图中编写优化查询,然后将其视为数据层中的任何其他表。
您可以使用包含或连接来完成相同的最终结果,甚至可以在跨表查询中写出表达式,但在我看来,视图是最干净,最有效的方法。