c# - 从多个表(C#实体)获取数据,通过外键链接,转换为匿名对象

标签 c# sql-server json entity-framework linq

我是 Entity/Linq/Lambda 新手,遇到以下问题:

我有一个 Web 应用程序,它通过 ASP.NET MVC 提供 JSON Api。数据库是MSSQL,我使用C# Entity Framework 作为数据访问层。

从单个表获取数据时,我需要将其转换为匿名对象,然后才能将其转换为 JSON 以避免循环引用错误。

这是一个简化的示例,但以这些表为例:

DB Schema

如果我只是想以 JSON 格式返回所有翻译器,我就是这样做的:

DBEntities db = new DBEntities();

var data = db.Translator.Select(x => new
        {
            TranslatorID = x.TranslatorID,
            FirstName = x.FirstName,
            LastName = x.LastName,
            Email = x.Email,
            Referenced = x.TranslatorLanguage.Count != 0
        });

        return Json(data, JsonRequestBehavior.AllowGet);

实体生成的模型类看起来像这样:

public partial class Translator
{

    public Translator()
    {
        this.TranslatorLanguage = new HashSet<TranslatorLanguage>();
    }

    public int TranslatorID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }

    public virtual ICollection<TranslatorLanguage> TranslatorLanguage { get; set; }
}

public partial class TranslatorLanguage
{
    public int TranslatorLanguageID { get; set; }
    public int SourceLanguageID { get; set; }
    public int TargetLanguageID { get; set; }

    public virtual Translator Translator { get; set; }
    public virtual Language Language1 { get; set; }
    public virtual Language Language2 { get; set; }
}

public partial class Language
{

    public Language()
    {
        this.TranslatorLanguage = new HashSet<TranslatorLanguage>();
        this.TranslatorLanguage1 = new HashSet<TranslatorLanguage>();
    }

    public int TranslatorLanguageID { get; set; }
    public int SourceLanguageID { get; set; }
    public int TargetLanguageID { get; set; }

    public virtual ICollection<TranslatorLanguage> TranslatorLanguage { get; set; }
    public virtual ICollection<TranslatorLanguage> TranslatorLanguage1 { get; set; }
}

但我希望能够返回一个包含所有翻译器的 JSON,其中每个翻译器对象都包含一个包含 TranslatorLanguage 条目的数组,并且对于每种源语言和目标语言都有其 varchar 代码和描述值。

我不知道该怎么做, 提前致谢。

最佳答案

与将 Translator 投影(选择)到匿名类型的方式相同,您可以将 TranslatorLanguage 投影到嵌套的匿名类型列表。

由于您已经定义了必要的导航属性,所以这非常简单 - 您所需要做的就是遵循查询内的导航属性(即导航),就像它们是对象一样:

var data = db.Translator.Select(t => new
{
    TranslatorID = t.TranslatorID,
    FirstName = t.FirstName,
    LastName = t.LastName,
    Email = t.Email,
    Languages = t.TranslatorLanguage.Select(tl => new
    {
        SourceCode = tl.Language1.Code,
        SourceDescription = tl.Language1.Description,
        TargetCode = tl.Language2.Code,
        TargetDescription = tl.Language2.Description,
    }).ToList()
}).ToList();

关于c# - 从多个表(C#实体)获取数据,通过外键链接,转换为匿名对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39163458/

相关文章:

c# - 导出到 Excel 不起作用

c# - 参数可选时如何获取默认构造函数

C# 局部变量在 Try-Catch-Finally 中访问之前可能不会初始化

sql-server - 在 Where 子句中排名

sql - 如何将 SQL 服务器转换为 Oracle?

c# - 如何告诉谷歌我有另一个页面?

sql-server - 了解使用 Azure 数据工厂的专用终结点的托管 VNet

java - 如何在另一个序列化程序中使用自定义 Json 序列化程序

java - 如何从 RestTemplate 交换方法中获取特定对象?

java - JSON 解析为 TextView Android API