包括不使用连接实体

时间:2016-11-02 13:01:14

标签: entity-framework asp.net-core entity-framework-core .net-core

作为示例,我有以下实体(多对多,我也删除了不道德的道具):

public class Buffet
{
    public int Id {get; set;}
    public string Name {get; set;}
}

public class Recipe
{
    public int Id {get; set;}
    public string Name {get; set;}
    public int CategoryId {get; set;}
    public virtual Category Category {get; set;}
}

public class Category
{
    public int Id {get; set;}
    public string Name {get; set;}
}

加入实体:

public class BuffetRecipe
{
    public int BuffetId {get; set;}
    public virtual Buffet Buffet {get; set;}
    public int RecipeId {get; set;}
    public virtual Recipe Recipe {get; set;}
}

我想获得属于特定自助餐的所有食谱,并希望包含食谱类别。

public IList<Recipe> GetRecipes(int buffetId)
{
    return _dbContext.BuffetRecipes
    .Where(item => item.BuffetId == buffetId)
    .Include(item => item.Recipe)
    .ThenInclude(item => item.Category)
    .Select(item => item.Recipe)
    .ToList();
}

我得到的列表总是返回具有prop = null的Recipes。 我没有找到使Include()与Select()...

一起工作的解决方案

我做错了什么?

更新:

我可以用这种方式工作......但我的感觉说这不是一个好方法,因为我有2个ToList()调用......但现在我的结果中包含了类别:

public IList<Recipe> GetRecipes(int buffetId)
{
    return _dbContext.BuffetRecipes
    .Where(item => item.BuffetId == buffetId)
    .Include(item => item.Recipe)
    .ThenInclude(item => item.Category)
    .ToList()
    .Select(item => item.Recipe)
    .ToList();
}

1 个答案:

答案 0 :(得分:3)

Include仅在可以应用于查询的最终结果时才有效。

可以将其更改为...

return _dbContext.BuffetRecipes
    .Where(item => item.BuffetId == buffetId)
    .Select(item => item.Recipe)
    .Include(rcp => rcp.Category)
    .ToList()

...但缺点是您复制了Recipe(尽可能多BuffetRecipes)。最好使用Recipe

开始查询
return _dbContext.Recipes
    .Where(rcp => rcp.BuffetRecipes.Any(br => br.BuffetId == buffetId))
    .Include(rcp => rcp.Category)
    .ToList();

您看到我冒昧地添加导航属性Recipe.BuffetRecipes。这不应该是你的模型的任何问题(相反,我会说)。