[英]Entity Framework with Include and Select together
我有以下實體(節省空間的偽代碼)
Program [ int Id,
string Name,
List<ProgramFoodType> ProgramFoodTypes,
List<ProgramFood> ProgramFoods]
ProgramFoodType[ int Id, int ProgramId, int Type, bool IsActive]
ProgramFood [ int Id, int ProgramId, Food Food, FoodType FoodType]
Food [int Id, string Name]
FoodType [int Id, string Name]
我的任務是獲取單個Program
及其相關ProgramFoodTypes
,條件 ProgramFoodType 應處於活動狀態,並且ProgramFoods
與相關實體Food
和FoodType
到目前為止,我使用了以下內容
1- 以下查詢將檢索ProgramFoodTypes
和ProgramFoods
的詳細信息,但它將帶來所有活動和非活動ProgramFoodTypes
var program = mEntities.Programs
.Include(p =>p.ProgramFoodTypes)
.Include(p =>p.ProgramFoods.Select(f =>f.Food))
.InClude(p =>p.ProgramFoods.Select( f =>f.FoodType))
.Where(m =>m.Id== Id);
2- 以下查詢將檢索詳細信息但缺少Food
和FoodType
var program = (from p in mEntities.Programs
where p.Id ==Id
select new {
Program = p,
ProgramFoodTypes = from pf in p.ProgramFoodTypes
where pf.IsActive
select pf,
ProgramFoods = p.ProgramFoods // here i can't add include statement
}).ToArray().Select(m => m.Program);
如何在第二個查詢中包含食物和食物類型?
對於您的第二個解決方案,我認為您可以使用:
var program = (from p in mEntities.Programs
.Include(p => p.ProgramFoods.Select(f => f.Food))
.Include(p => p.ProgramFoods.Select(f => f.FoodType))
where p.Id == Id
select new {
Program = p,
ProgramFoodTypes = from pf in p.ProgramFoodTypes
where pf.IsActive
select pf,
p.ProgramFoods
}).ToArray().Select(m => m.Program);
更新:由於您在 linq 查詢中使用匿名類型, Include 語句被忽略。
您必須在客戶端加載所有相關的ProgramFoodTypes
,然后進行過濾:
var program = mEntities.Programs
.Include(p => p.ProgramFoodTypes)
.Include(p => p.ProgramFoods.Select(f => f.Food))
.Include(p => p.ProgramFoods.Select(f => f.FoodType))
.SingleOrDefault(m => m.Id == Id);
program.ProgramFoodTypes = program.ProgramFoodTypes.Where(pft => pft.IsActive);
您可以使用AsNoTracking()
或在新對象中克隆返回的Program
對象,以防您想確保數據在 db 端完好無損。
嘗試這個:
var program = mEntities.Programs
.Include(p => p.ProgramFoodTypes)
.Include(p => p.ProgramFoods.Select(f => f.Food))
.InClude(p => p.ProgramFoods.Select(f => f.FoodType))
.SingleOrDefault(m => m.Id == Id && m.ProgramFoodTypes.All(t => t.IsActive));
或許:
var program = (from p in mEntities.Programs
where p.Id ==Id
select new {
Program = p,
ProgramFoodTypes = from pf in p.ProgramFoodTypes
where pf.IsActive
select pf,
ProgramFoods = p.ProgramFoods.Select(y => new {
Food = y.Food,
Type = y.FoodType
})
}).ToArray().Select(m => m.Program);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.