2016-04-29 1 views
-1

2つのテーブルがあります。 Wordテーブルには単語のリストが含まれ、WordFormテーブルには各単語の品詞のリストが含まれています。LINQを使用して親/子テーブルからデータの「フラット」出力を得る方法

public class Word 
{ 
    public Word() 
    { 
     CategoryId = 1; 
     WordForms = new System.Collections.Generic.List<WordForm>(); 
    } 
    public string WordId { get; set; } // WordId (Primary key) (length: 20) 
    public int CategoryId { get; set; } // CategoryId 
    public virtual System.Collections.Generic.ICollection<WordForm> WordForms { get; set; } // WordForm.FK_WordFormWord 
    public virtual WordCategory WordCategory { get; set; } // FK_WordWordCategory 

} 

public class WordForm 
{ 
    public string WordFormId { get; set; } // WordFormId (Primary key) (length: 20) 
    public string WordId { get; set; } // WordId (length: 20) 
    public int PosId { get; set; } // PosId 
    public string Definition { get; set; } // Definition 
    public virtual Pos Pos { get; set; } // FK_WordFormPos 
    public virtual Word Word { get; set; } // FK_WordFormWord 
} 

私はこのように、これらの2つの表を結合しようとした:

var word = db.Words 
      .Include(wf => wf.WordForms) 
      .AsNoTracking() 
      .FirstOrDefaultAsync(); 

これは私にオブジェクト形式での出力が得られます。

WordId CategoryId WordFormId PosId Definition 
WordId CategoryId WordFormId PosId Definition 
WordId CategoryId WordFormId PosId Definition 
WordId CategoryId WordFormId PosId Definition 
+0

? – Efrain

答えて

1

あなたは出力を平坦化するSelectManyを使用することができます。

var words = db.Words 
       .Include(wf => wf.WordForms) 
       .SelectMany(w => w.WordForms.Select(wf => new 
       { 
        WordId = w.WordId, 
        CategoryId = w.CategoryId, 
        WordFormId = wf.WordFormId, 
        PosId = wf.PosId, 
        Definition = wf.Definition 
       })); 

だけ最初Wordのための結果をしたい場合:

あなたが最終的にあなたのデータを配置する必要があります
var word = await db.Words 
        .Include(wf => wf.WordForms) 
        .AsNoTracking() 
        .FirstOrDefaultAsync(); 

var output = word.WordForms.Select(wf => new 
{ 
    WordId = wf.Word.WordId, 
    CategoryId = wf.Word.CategoryId, 
    WordFormId = wf.WordFormId, 
    PosId = wf.PosId, 
    Definition = wf.Definition 
}); 
+0

本当に良い答えをありがとう。私がただ一つのカテゴリを選びたいのであれば、db.Wordsの後に.Where(w => w.CategoryId = 123)とするだけです。 – Alan2

+0

はい、そうです。 –

+0

申し訳ありませんが、 'Include'の後にあります。 –

2

あなただけで開始するWordFormを使用することができます:私は私には、各行が、これらの列の全て有している場合、このようなデータを返したように、テーブルにあるものを見ることができますか

from wf in db.WordForms 
    //your where conditions even on wf.Word 
    select new 
    { 
     WordId = wf.Word.WordId, 
     CateogoryId = wf.Word.CategoryId, 
     WordFormId = wf.WordFormId, 
     PosId = wf.PosId, 
     Definition = wf.Definition 
    } 
関連する問題