从多个表(C#实体)获取数据,这些表由外键链接,并转换为匿名对象

从多个表(C#实体)获取数据,这些表由外键链接,并转换为匿名对象,c#,sql-server,json,entity-framework,linq,C#,Sql Server,Json,Entity Framework,Linq,我是Entity/Linq/Lambda的新手,有以下问题: 我有一个通过ASP.NET MVC提供JSON Api的web应用程序。数据库是MSSQL,我使用C#实体框架作为数据访问层 当从单个表获取数据时,我需要将其转换为匿名对象,然后才能将其转换为JSON以避免循环引用错误 这是一个简化的示例,但以以下表格为例: 如果我只想返回JSON中的所有翻译器,我将这样做: DBEntities db = new DBEntities(); var data = db.Translator.Se

我是Entity/Linq/Lambda的新手,有以下问题:

我有一个通过ASP.NET MVC提供JSON Api的web应用程序。数据库是MSSQL,我使用C#实体框架作为数据访问层

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

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

如果我只想返回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; }
}
公共部分类转换器
{
公共翻译()
{
this.translaterLanguage=new HashSet();
}
公共int TranslatorID{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串电子邮件{get;set;}
公共虚拟ICollection TranslatorLanguage{get;set;}
}
公共部分类翻译语言
{
公共int TranslatorLanguageID{get;set;}
public int SourceLanguageID{get;set;}
public int TargetLanguageID{get;set;}
公共虚拟翻译器{get;set;}
公共虚拟语言1{get;set;}
公共虚拟语言2{get;set;}
}
公共部分类语言
{
公共语言()
{
this.translaterLanguage=new HashSet();
this.translaterLanguage1=新的HashSet();
}
公共int TranslatorLanguageID{get;set;}
public int SourceLanguageID{get;set;}
public int TargetLanguageID{get;set;}
公共虚拟ICollection TranslatorLanguage{get;set;}
公共虚拟ICollection TranslatorLanguage1{get;set;}
}
但我希望能够返回一个JSON和所有的Translator,其中每个Translator对象包含一个带有TranslatorLanguage条目的数组,并且每个源语言和目标语言都有它的varchar代码和描述值

我不知道该怎么办, 提前感谢。

与您将
Translator
投影到匿名类型的方式相同,您可以将
Translator语言投影到嵌套的匿名类型列表中

因为您已经定义了必要的导航属性,所以非常简单-您只需在查询中遵循导航属性(即导航),就像它们是对象一样:

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();

你能添加类的定义吗?请将实体模型添加到问题我更改了我的问题并添加了可能生成的模型为什么在序列化对象时不忽略ReferenceLoopHandling?我该怎么做?非常感谢,这正是我所需要的!