JoinQueryOver และ JoinAlias ​​ต่างกันอย่างไร


คำตอบ:


108

พวกเขาทำสิ่งเดียวกันตามหน้าที่สร้างการเข้าร่วมกับเอนทิตีอื่น ความแตกต่างเพียงอย่างเดียวคือสิ่งที่พวกเขากลับมา JoinQueryOver ส่งคืน QueryOver ใหม่โดยมีเอนทิตีปัจจุบันเป็นเอนทิตีที่เข้าร่วมในขณะที่ JoinAlias ​​ส่งคืน QueryOver เดิมที่มีเอนทิตีปัจจุบันเป็นเอนทิตีหลักดั้งเดิม

ไม่ว่าคุณจะใช้อันไหนเป็นเรื่องของรสนิยมส่วนตัว: (จากhttp://nhibernate.info/doc/nh/en/index.html#queryqueryover )

IQueryOver<Cat,Kitten> catQuery =
    session.QueryOver<Cat>()
        .JoinQueryOver<Kitten>(c => c.Kittens)
            .Where(k => k.Name == "Tiddles");

และ

Cat catAlias = null;
Kitten kittenAlias = null;
IQueryOver<Cat,Cat> catQuery =
    session.QueryOver<Cat>(() => catAlias)
        .JoinAlias(() => catAlias.Kittens, () => kittenAlias)
        .Where(() => kittenAlias.Name == "Tiddles");

มีหน้าที่เหมือนกัน สังเกตว่าลูกแมวเลียสถูกอ้างอิงอย่างชัดแจ้งในคำค้นหาที่สองอย่างไร


7
โปรดทราบว่าในตัวอย่างที่สองคุณต้องประกาศนามแฝงKitten kittenAlias = null;และCat catAlias = null;ก่อนหน้านี้ ฉันคิดว่ามันยุ่งฉันจึงไม่ใช้JoinAliasถ้ามันไม่จำเป็น
foka

ขอบคุณ @foka ที่ชี้แจงเรื่องนี้ ฉันพลาดสิ่งนี้และสงสัยว่าทำไมมันถึงใช้ไม่ได้
Mario Tacke

12

QueryOver Series - ตอนที่ 2: พื้นฐานและการเข้าร่วมโดย Andrew Whitakerให้คำอธิบายที่ดีมาก:

สรุป:

  • IQueryOverเป็นประเภททั่วไปที่มีพารามิเตอร์สองประเภทTRootและTSubType
  • .SelectดำเนินการในTRootขณะที่วิธี QueryOver อื่น ๆ TSubTypeที่ดำเนินการเกี่ยวกับ
  • TRootจะยังคงเหมือนกับที่คุณสร้างแบบสอบถาม แต่TSubTypeจะเปลี่ยนแปลงเมื่อคุณเข้าร่วมโดยใช้JoinQueryOver
  • JoinQueryOverและJoinAliasเพิ่มการรวมในแบบสอบถามของคุณ JoinAliasไม่เปลี่ยนแปลงTSubTypeแต่JoinQueryOverทำ
  • คุณสามารถใช้นามแฝงเมื่อสร้างแบบสอบถามเพื่ออ้างถึงคุณสมบัติที่ไม่ได้เป็นของTRootหรือTSubType
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.