Apa perbedaan antara JoinQueryOver dan JoinAlias?


88

Saya perlu tahu apa perbedaan antara JoinQueryOver dan JoinAlias, dan kapan harus menggunakannya?

Jawaban:


108

Secara fungsional mereka melakukan hal yang sama, membuat join ke entitas lain. Satu-satunya perbedaan adalah apa yang mereka kembalikan. JoinQueryOver mengembalikan QueryOver baru dengan entitas saat ini menjadi entitas yang digabungkan, sementara JoinAlias ​​mengembalikan QueryOver asli yang memiliki entitas saat ini sebagai entitas akar asli.

Apa pun yang Anda gunakan adalah masalah selera pribadi: (dari 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");

dan

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

Secara fungsional sama. Perhatikan bagaimana kittenAlias ​​direferensikan secara tegas dalam kueri kedua.


7
Perhatikan bahwa dalam contoh kedua Anda harus mendeklarasikan alias Kitten kittenAlias = null;dan yang Cat catAlias = null;lebih lama. Saya merasa berantakan, jadi saya tidak menggunakannya JoinAliaskecuali jika diperlukan.
foka

Terima kasih @foka telah mengklarifikasi hal ini. Saya melewatkan ini dan bertanya-tanya mengapa itu tidak berhasil.
Mario Tacke

12

Seri QueryOver - Bagian 2: Dasar-dasar dan Bergabung oleh Andrew Whitaker memberikan penjelasan yang sangat bagus:

Ringkasan:

  • IQueryOveradalah tipe generik dengan dua parameter tipe TRootdanTSubType
  • .Selectberoperasi TRootsaat metode QueryOver lain beroperasi TSubType.
  • TRoottetap sama saat Anda membuat kueri, tetapi TSubTypeberubah saat Anda bergabung menggunakanJoinQueryOver
  • JoinQueryOverdan JoinAliastambahkan gabungan ke kueri Anda. JoinAliastidak berubah TSubType, tapi berubah JoinQueryOver.
  • Anda dapat menggunakan alias saat membuat kueri untuk merujuk ke properti yang bukan milik TRootatauTSubType
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.