回答

收藏

Linq to NHibernate生成到同一表的多个联接

技术问答 技术问答 217 人阅读 | 0 人回复 | 2023-09-13

当我在where子句中对select中的同一表进行引用时,linq to Nhibernate会生成两个联接,一个用于select,一个用于where。IE
# X  E0 {! ~# g% k. O; Z4 Cfrom child in Session.Query()) K. S7 [0 e0 W" W) z& P
where child.Parent.Name == "Bob" " A) a6 Q8 b! k" G
select new Info
' c" N6 x; L1 P+ a/ u, m) W' r) V{ % }, K% e- _. k# E5 ]$ w
   ParentAge = child.Parent.Age,
+ ?8 q+ r1 G" }" m! a& V   ChildName = child.Name
8 w" g+ N! Z- M3 Y1 @};
8 x; J- _6 r1 ~. I: Y- W生成如下的SQL:5 I* X$ b. d3 k1 v, m0 f
Select this_.Name,
' G$ O# }& e7 o       parent1.Age
6 B; `, @1 p) VFrom Child this_
1 h) d7 u* o: N- G; b* ^# U" j     left join Parent parent1 on child.ParentId = parent1.Id,
6 P& h# m# Z1 t0 U- l$ Q# eParent parent2% y# I0 j  L5 Y( R
Where child.ParentId = parent2.Id and parent2.Name = 'Bob'
% H" F/ o% q: t. k- w+ a  f! H我本以为我应该更喜欢SQL:
6 u; J1 ]3 c+ e/ y$ FSelect this_.Name,
9 R8 A# R$ p$ d9 i# Q, r+ C. X       parent1.Age
6 @; M$ \8 |- s5 }8 B3 w4 C- IFrom Child this_
5 {- X2 m7 w6 _; J- l' ^1 d7 i         inner join Parent parent1 on child.ParentId = parent1.Id
6 k2 `  J- V1 L" `& K! VWhere parent1.Name = 'Bob'# F# p! v' {. ?+ _) r+ Y2 a
有没有一种方法可以构造查询来实现这一点?有关系吗?) f  e3 ?2 F6 c& j* X2 U, q
               
2 Y" m# |5 F5 m解决方案:( z# Y8 B( {  r: ~3 }
                7 {* b- R8 B& l' f* P" N/ p
+ U+ Q1 V& d1 v( m1 s7 o# s  ^

7 C+ X, ?  |8 J: @9 \% n7 ?                您是否尝试过比较SSMS中每个查询的查询执行计划?如果在SQL
9 k; i& R# D' j4 G& \- qServer中消除了重复的联接,则没关系。我发现在某些情况下,我认为生成的查询将非常低效,但经过优化后,它最终与 看起来 更好的查询完全相同。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则