我是 Entity/Linq/Lambda 新手,遇到以下问题:
我有一个 Web 应用程序,它通过 ASP.NET MVC 提供 JSON Api。数据库是MSSQL,我使用C# Entity Framework 作为数据访问层。
从单个表获取数据时,我需要将其转换为匿名对象,然后才能将其转换为 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; }
}
但我希望能够返回一个包含所有翻译器的 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/