如何使用LINQ从父/子表中获取“平面”数据输出

时间:2016-04-29 16:47:49

标签: c# sql-server linq

我有两张桌子。 Word表包含单词列表,然后WordForm表包含每个单词的词性列表。

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
}

我尝试加入这两个表:

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

2 个答案:

答案 0 :(得分: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
    }

答案 1 :(得分: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
});