วิธีรวมวัตถุลูกของวัตถุลูกใน Entity Framework 5


138

ฉันใช้และEntity Framework 5 code firstASP.NET MVC 3

ฉันกำลังดิ้นรนเพื่อให้วัตถุลูกของวัตถุเด็กเติม ด้านล่างเป็นชั้นเรียนของฉัน ..

คลาสแอปพลิเคชัน

public class Application
{
     // Partial list of properties

     public virtual ICollection<Child> Children { get; set; }
}

ชั้นเรียนเด็ก:

public class Child
{
     // Partial list of properties

     public int ChildRelationshipTypeId { get; set; }

     public virtual ChildRelationshipType ChildRelationshipType { get; set; }
}

คลาส ChildRelationshipType:

public class ChildRelationshipType
{
     public int Id { get; set; }

     public string Name { get; set; }
}

ส่วนหนึ่งของวิธี GetAll ในที่เก็บเพื่อส่งคืนแอปพลิเคชันทั้งหมด:

return DatabaseContext.Applications
     .Include("Children");

คลาส Child มีการอ้างอิงไปยังคลาส ChildRelationshipType หากต้องการทำงานกับลูก ๆ ของแอปพลิเคชันฉันจะมีสิ่งนี้:

foreach (Child child in application.Children)
{
     string childName = child.ChildRelationshipType.Name;
}

ฉันได้รับข้อผิดพลาดที่นี่ว่าบริบทวัตถุถูกปิดไปแล้ว

ฉันจะระบุได้อย่างไรว่าวัตถุลูกแต่ละอันจะต้องรวมChildRelationshipTypeวัตถุอย่างที่ฉันทำไว้ด้านบนด้วย


ซ้ำซ้อนที่เป็นไปได้ของEntity Framework - รวมคุณสมบัติหลายระดับ
Michael Freidgeim

คำตอบ:


256

หากคุณรวมไลบรารี่System.Data.Entityคุณสามารถใช้โอเวอร์โหลดของInclude()เมธอดที่รับนิพจน์แลมบ์ดาแทนสตริง จากนั้นคุณสามารถSelect()อยู่เหนือเด็ก ๆ ด้วยการแสดงออกของ Linq มากกว่าstringเส้นทาง

return DatabaseContext.Applications
     .Include(a => a.Children.Select(c => c.ChildRelationshipType));

6
ในฐานะที่เป็น GraemeMiller กล่าวว่าคลาสที่พิมพ์อย่างรุนแรงจะดีกว่าสำหรับการบำรุงรักษามากกว่าการใช้สตริง
Ryan Amies

วิธีการ lamba รุ่นใดมาให้ใช้งานได้บ้าง ฉันติดอยู่กับ Codebase ของ EF 4.0 และไม่สามารถทำงานได้ ขอบคุณสำหรับการป้อนข้อมูลใด ๆ
granadaCoder

5
มันจะทำงานใน EF 4 เพียงแค่เพิ่มการอ้างอิงถึงSystem.Data.Entity;
Ryan Amies

5
FYI - ใน EF 6 เนมสเปซคือMicrosoft.Data.Entity
แบรด

เมื่อใช้ EF 5 ฉันไม่สามารถรับ. Select (x => x.Child) ได้ แต่สิ่งนี้ใช้งานได้ - Entities.UserProfile hiddenProfile = db.UserProfiles .Include (s => s.ShippingAddress) .Include (st => st.ShippingAddress) StateProvince) .Include (b => b.BillingAddress) .Include (bs => bs.BillingAddress.StateProvince) .FirstOrDefault (x => x.UserId == userId);
Geovani Martinez

91

ด้วย EF Core ใน. NET Core คุณสามารถใช้คำหลักThenInclude:

return DatabaseContext.Applications
 .Include(a => a.Children).ThenInclude(c => c.ChildRelationshipType);

รวม Childs จากคอลเล็กชันสำหรับเด็ก:

return DatabaseContext.Applications
 .Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType1)
 .Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType2);

6
ขอบคุณ !!! มีประโยชน์จริง ๆ ! บางครั้งคุณอาจได้รับข้อมูลผิดพลาดเพียงแค่เพิกเฉยและสร้างมันขึ้นมา! :)
muhihsan

เป็นคนที่ดีฉันกำลังมองหา. net core :)
Andy Clarke

1
และถ้าเด็กเป็นคอลเล็กชันและฉันต้องรวมคุณสมบัติไว้ด้วย?
dodbrian

พบว่าเกินพิกัดสำหรับสิ่งนั้น ไม่ชัดเจนในตอนแรก
dodbrian

1
@dodbrian สิ่งที่เกินพิกัดคืออะไร? ฉันพยายามที่จะทำรังแล้วรวมที่เด็กเป็นคอลเลกชัน
เกร็ก Hardin

22

ฉันลงเอยด้วยการทำสิ่งต่อไปนี้และได้ผล:

return DatabaseContext.Applications
     .Include("Children.ChildRelationshipType");

76
วิธีการพิมพ์ที่แข็งแกร่งจะดีกว่า สายเวทไม่ดีสำหรับการปรับโครงสร้างใหม่
GraemeMiller

2

ตัวอย่างที่ดีของการใช้รูปแบบ Generic Repository และการใช้โซลูชันทั่วไปสำหรับสิ่งนี้อาจมีลักษณะเช่นนี้

public IList<TEntity> Get<TParamater>(IList<Expression<Func<TEntity, TParamater>>> includeProperties)

{

    foreach (var include in includeProperties)
     {

        query = query.Include(include);
     }

        return query.ToList();
}

ฉันจะเรียกวิธีข้างต้นได้อย่างไร คุณสามารถยกตัวอย่างได้ไหม
Jamee

@Jamee -List <Expression <Func <PersonObject, object >>> includers = new List <Expression <Func <PersonObject, object >>> (); includers.Add (x => x.FirstName); รับ <PersonObject> (includers);
gcoleman0828

1
และแบบสอบถามมาจาก ... ?
ดั๊กเครา

ขออภัย @DougBeard ไม่ได้ติดตามคำถามของคุณ
gcoleman0828

1
@ gcoleman0828 ตัวแปรแบบสอบถามในข้อมูลโค้ดของคุณด้านบน มันยกตัวอย่างอย่างน่าอัศจรรย์? มันมาจากไหน?
Doug Beard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.