作为示例,我有以下实体(多对多,我也删除了不道德的道具):
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();
}
答案 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
。这不应该是你的模型的任何问题(相反,我会说)。