如何链接两个类,使用Entity Framework和LINQ选择并仍然获得列表输出?

时间:2017-01-12 16:02:41

标签: c# entity-framework linq

我有两个对象:PhraseCategory和Phrase。这是班级:

public class PhraseCategory
{
    public System.Guid PhraseCategoryId { get; set; } // PhraseCategoryId
    public int PhraseCategoryShortId { get; set; } // PhraseCategoryShortId (Primary key)
    public int PhraseCategoryGroupId { get; set; } // PhraseCategoryGroupId
    public string Name { get; set; } // Name (length: 20)
    // Reverse navigation
    public virtual System.Collections.Generic.ICollection<Phrase> Phrases { get; set; } // Phrase.FK_PhrasePhraseCategory
}

public class Phrase : AuditableTable
{
    public System.Guid PhraseId { get; set; } // PhraseId (Primary key)
    public string English { get; set; } // English
    public int? CategoryId { get; set; } // CategoryId

    // Foreign keys
    public virtual PhraseCategory PhraseCategory { get; set; } // FK_PhrasePhraseCategory
}

有人可以告诉我如何加入这些,以便我能够选择所有短语,例如PhraseCategoryGroupId为25.

这是我现在所拥有的,但它没有考虑到我还需要能够选择具有PhraseCategoryGroupId的PhraseCategory的短语:

        List<Phrase> phrases;

        var query = db.Phrases.AsQueryable();

        if (options.CreatedBy != 0) query = query
            .Where(w => w.CreatedBy == options.CreatedBy);

        phrases = await query
            .AsNoTracking()
            .ToListAsync();

        return Ok(phrases);

请注意,我想得到一个平坦的输出(希望有意义)。我的意思是一个包含的列表:

PhraseId,English和CategoryId

1 个答案:

答案 0 :(得分:1)

这可以满足您的需求:

phrases = phrases.Where( x => x.PhraseCategory.PhraseCategoryGroupId == 25 )
                 .Select( x => new 
                         { 
                            PhraseId = x.PhraseId, 
                            English = x.English, 
                            CategoryId = x.CategoryId 
                         });

请注意,您还可以创建其他类型的实例,而不是我在上述查询中创建的匿名类型。

此外,由于您在属性上启用了延迟加载,因此PhraseCategory将在上述查询中延迟加载:它是虚拟的。如果您在全局禁用了延迟加载,则需要在查询中使用Include方法。然后您的查询将变为:

phrases = phrases.Include(x => x.PhraseCategory)
                 .Where( x => x.PhraseCategory.PhraseCategoryGroupId == 25 )
                 .Select( x => new 
                               { 
                                  PhraseId = x.PhraseId, 
                                  English = x.English, 
                                  CategoryId = x.CategoryId 
                                });