Apa perbedaan antara JoinQueryOver dan JoinAlias?

88

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

Luka
sumber

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.

Vadim
sumber
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
Michał Powaga
sumber