2016-08-26 9 views
1

私はエンティティ/ LINQの/ラムダに新たなんだと、私は次のような問題を持っているに変換しましたJSON ApiからASP.NET MVCまでデータベースはMSSQLで、データアクセス層としてC#エンティティフレームワークを使用しています。の取得データは、匿名オブジェクト

1つのテーブルからデータを取得する場合、これを匿名オブジェクトに変換してから、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; } 
} 

しかし、各TranslatorオブジェクトにTranslatorLanguageエントリを持つ配列が含まれているすべてのトランスレータと、ソース言語とターゲット言語のそれぞれがvarcharコードと説明値を持つJSONを返すことができるようにしたいと考えています。

私はこのことについてどうすればいいか分かりません。 ありがとうございます。

+0

はあなたが定義を追加することができますあなたのクラスの? –

+0

plz質問にエンティティモデルを追加 –

+0

質問を変更し、生成されるモデルを追加しました – Ruben

答えて

1

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

ありがとう、それは私が必要としていたものです! – Ruben

関連する問題