2015-07-08 16 views
5

tôi có các đối tượng sau (mã giả để tiết kiệm không gian)Entity Framework với Include và chọn cùng

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] 

nhiệm vụ của tôi là để có được đơn Program với liên quan ProgramFoodTypes của nó với điều kiện ProgramFoodType cần chủ động và ProgramFoods với liên quan tổ chức FoodFoodType

tôi đã sử dụng sau đây cho đến nay

1- truy vấn dưới đây sẽ lấy các chi tiết của ProgramFoodTypesProgramFoods nhưng nó sẽ mang lại tất cả các hoạt động và không hoạt động 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- truy vấn dưới đây sẽ lấy các chi tiết nhưng thiếu 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); 

cách đưa thức ăn và các loại thực phẩm trong truy vấn thứ hai?

Trả lời

1

có thể là:

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

Nó hoạt động tốt, chỉ cần tôi thêm ProgramFood nó tự hoặc nó sẽ không được lấy ra, cảm ơn bạn – Monah

1

Hãy thử điều này:

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

nó trở System.NullReferenceException (đối tượng tham chiếu không được đặt để một thể hiện của một đối tượng). – Monah

+0

Nếu bạn có nghĩa là 'chương trình' là null, đó là vì không tìm thấy kết quả nào phù hợp với tiêu chí. – haim770

+0

Tôi nghĩ rằng những gì OP đang cố gắng đạt được là lấy đối tượng nhưng chỉ các ProgramFoodTypes có liên quan mà 'IsActive' của chúng được đặt thành true. – Kamyar

2

Đối với giải pháp thứ hai của bạn, tôi nghĩ bạn có thể sử dụng:

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

cập nhật: Vì bạn đang sử dụng loại vô danh trong truy vấn LINQ của bạn, Include statements are dismissed.
Bạn sẽ phải tải tất cả các liên quan ProgramFoodTypes ở phía máy khách và sau đó thực hiện việc lọc:

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

Bạn có thể sử dụng AsNoTracking() hoặc clone trở Program đối tượng trong một đối tượng mới trong trường hợp bạn muốn chắc chắn dữ liệu của bạn sẽ vẫn được duy trì trên db-side.

+0

Thực phẩm và FoodType vẫn còn trống trong kết quả – Monah

+0

Ahh tôi thấy. Đó là vì bạn đã chọn oobject ẩn danh không phải là thực thể. cập nhật câu trả lời của tôi ... – Kamyar

+0

Tôi đã cố gắng tránh chia tách truy vấn và để làm cho nó đơn giản, phần còn thiếu là tôi có thể Bao gồm thực phẩm và loại thực phẩm trong truy vấn con ẩn danh, như @ tschmit007 được đề cập trong câu trả lời của mình, cảm ơn bạn cho bản cập nhật của bạn, tôi nghĩ rằng nó sẽ làm việc kể từ khi nó được chia nhỏ. – Monah