作為示例,我有以下實體(多對多,我也刪除了不道德的道具):

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 Category = 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();
}

熱門答案

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 。這不應該是你的模型的任何問題(相反,我會說)。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow