2

다음의 두 엔티티가 있다고 가정 해 봅시다. 나는이 같은 쿼리를 작성할 때이 Hibernate 3.2 linq 질의를 최적화하는 방법

public class Foo { 
    public virtual int Id {get;set;} 
    public virtual int Version {get;set;} 
    public virtual string SomeProp {get;set;} 
    public virtual Bar Bar {get;set;} 
} 

public class Bar { 
    public virtual int Id {get;set;} 
    public virtual int Version {get;set;} 
    public virtual string Name {get; set;} 
} 

//Fluent Mappings 
public class FooMapping :ClassMap<Foo> 
{ 
    public FooMapping() 
    { 
     Id (f => f.Id).GeneratedBy.Identity(); 
     Version(f => f.Version); 
     Map(f=> f.SomeProp).Column("fooprop1"); 
     References(f => f.Bar).Column("foobarid").Not.Null(); 
    } 
} 

public class BarMapping :ClassMap<Bar> 
{ 
    public BarMapping() 
    { 
     Id (b => b.Id).GeneratedBy.Identity(); 
     Version(b => b.Version); 
     Map(b => b.name).Column("barname"); 
    } 
} 

(나는 불면증의 약간 인과 메모리에서이 문제를 입력하고, 코드의 오타를 용서하십시오) :

var query = from f in Session.Query<Foo>() 
      where f.Bar.Id == 5 
      select new {f.Id, f.SomeProp}; 

나는 NHibernate에이 발생 통지 SQL 쿼리를 Bar 테이블에 대한 내부 조인과 함께 사용하고 Bar 테이블의 Id에 where 절을 사용합니다. bar.id = 5가 유효한 바 ID인지 확인하기 위해이 작업을 수행하는 것으로 판단됩니다.

내 질문에 어떻게 foo.foobarid 열에 대해 혼자 foo 테이블을 쿼리 할 수 ​​있도록 NHibernate 말할 수 있습니다. 이런 식으로 뭔가 :

SELECT f.id, f.prop1 FROM foo f WHERE f.foobarid = 5

당신이 제공 할 수있는 통찰력 사전에 감사합니다!

답변

2

Linq (이 문서는 HQL에 대해 문서화되어 있고 작동 중입니다)와 같이 최적화 된 것으로 보입니다.

그러나 해결 방법으로 Bar 개체를 비교할 수 있습니다. session.load()은 DB에 도달하지 않으므로 추가 공연 비용이 들지 않습니다.

var bar = Session.Load<Bar>(5); 
var query = from f in Session.Query<Foo>() 
      where f.Bar == bar 
      select new {f.Id, f.SomeProp}; 
+0

답장을 보내 주셔서 감사합니다. 완벽하게 작동했습니다! NH-Linq의 최신 버전이이 최적화를 사용하기를 희망하지만, 지금 당장이 기능이 작동합니다. – NYCChris

관련 문제