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

时间:2016-02-26 04:40:01

标签: c# entity-framework dbset

使用Entity Framework 6时,当我有DbSetDbContext时,如何使用来自其他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是外来的OtherDataDbSet<OtherData>对象的关键引用。

我想获取Data中的所有DbSet<Data>个对象,以及父DbSet个对象Data和{{1}的其他id数据和} name对象&{39} OtherDataid。我需要将它放在一个从Web服务GET发送的对象中。

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

我是否需要一些代码:

name

我可以帮助您使用此代码吗?

2 个答案:

答案 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来组合字段。在视图中编写优化查询,然后将其视为数据层中的任何其他表。

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