包含和选择的实体框架

时间:2015-07-08 11:36:33

标签: c# asp.net-mvc entity-framework ef-code-first

我有以下实体(用于节省空间的伪代码)

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带有相关实体FoodFoodType

到目前为止,我使用了以下内容

1-以下查询将检索ProgramFoodTypesProgramFoods的详细信息,但会显示所有有效和无效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-以下查询将检索详细信息但缺少FoodFoodType

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);

如何在第二个查询中包含食物和食物类型?

3 个答案:

答案 0 :(得分:2)

对于您的第二个解决方案,我认为您可以使用:

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,                  
             ProgramFoods = p.ProgramFoods 
          }).ToArray().Select(m => m.Program);

<强>更新: 由于您在linq查询中使用了匿名类型,Include statements are dismissed.
您必须在客户端加载所有相关的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对象,以防您想确保数据在数据库端完好无损。

答案 1 :(得分:1)

试试这个:

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));

答案 2 :(得分:1)

可能是:

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);