Tôi cần biết sự khác biệt giữa JoinQueryOver và JoinAlias, và khi nào thì sử dụng chúng?
Câu trả lời:
Về mặt chức năng, chúng làm điều tương tự, tạo một liên kết đến một thực thể khác. Sự khác biệt duy nhất là những gì họ trở lại. JoinQueryOver trả về một QueryOver mới với thực thể hiện tại là thực thể được tham gia, trong khi JoinAlias trả về QueryOver ban đầu có thực thể hiện tại là thực thể gốc ban đầu.
Việc bạn sử dụng cái nào là vấn đề cá nhân: (từ 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");
và
Cat catAlias = null;
Kitten kittenAlias = null;
IQueryOver<Cat,Cat> catQuery =
session.QueryOver<Cat>(() => catAlias)
.JoinAlias(() => catAlias.Kittens, () => kittenAlias)
.Where(() => kittenAlias.Name == "Tiddles");
Có chức năng giống nhau. Lưu ý cách kittenAlias được tham chiếu rõ ràng trong truy vấn thứ hai.
Loạt bài QueryOver - Phần 2: Khái niệm cơ bản và tham gia của Andrew Whitaker đưa ra lời giải thích rất hay:
Tóm lược:
IQueryOver
là một kiểu chung với hai tham số kiểuTRoot
vàTSubType
.Select
hoạt động trênTRoot
trong khi các phương thức QueryOver khác hoạt độngTSubType
.TRoot
giữ nguyên khi bạn đang tạo truy vấn, nhưngTSubType
thay đổi khi bạn tham gia bằngJoinQueryOver
JoinQueryOver
vàJoinAlias
thêm liên kết vào truy vấn của bạn.JoinAlias
không thay đổiTSubType
, nhưngJoinQueryOver
có.- Bạn có thể sử dụng bí danh khi tạo truy vấn để tham chiếu đến các thuộc tính không thuộc về
TRoot
hoặcTSubType
Kitten kittenAlias = null;
vàCat catAlias = null;
trước đó. Tôi thấy nó lộn xộn, vì vậy tôi không sử dụngJoinAlias
trừ khi cần thiết.