2014-01-13 3 views
6

NHibernate 3.3.1.400을 사용하여 NHibernate의 Linq 공급자를 사용하여 간단한 SQL 구문을 표현하는 데 문제가 있습니다.NHibernate Linq 쿼리를 사용하여 내부 조인을 공식화하는 데 문제가 발생했습니다.

내 도메인 모델은 다음과 같습니다

내 쿼리와 일치하는 항목 요소의 목록을 반환하도록되어
public class Site 
{ 
    public virtual Guid Id {get; set;} 
    public virtual string Name {get; set;} 
} 

// a site has many filers 
public class Filer 
{ 
    public virtual Guid Id {get set;} 
    public virtual Site Site {get; set;} 
    public virtual string Name {get; set;} 
} 

// a filer has many filings 
public class Filing 
{ 
    public virtual Guid Id {get set;} 
    public virtual Filer Filer {get; set;} 
    public virtual DateTime FilingDate {get; set;} 
} 

//a filing has many items 
public class Item 
{ 
    public virtual Guid Id {get set;} 
    public virtual Filing Filing {get; set;} 
    public virtual DateTime Date {get; set;} 
    public virtual decimal Amount {get; set;} 
} 

public class SearchName 
{ 
    public virtual Guid Id {get set;} 
    public virtual string Name {get; set;} 
} 

// there are potentially many NameLink objects tied to a single search name 
public abstract class NameLink 
{ 
    public virtual Guid Id {get set;} 
    public virtual SearchName SearchName {get; set;} 
} 

public class NameLinkToFiler: NameLink 
{ 
    public virtual Filer Filer {get; set;} 
} 

public class NameLinkToItem: NameLink 
{ 
    public virtual Item Item {get; set;} 
} 

:

var query = session.Query<Item>() 
    .Where(x => x.Filing.Filer.Site == mySite); 

상기 연결 사이트에 가입 -> 파일러 -> 파일링 -> 항목은 내 매핑을 통해 잘 작동하지만 사용자 입력을 기반으로 NameLinkToFiler 또는 NameLinkToItem 클래스에 가입하려고하면 문제가 발생합니다.

사용자가 쿼리가 파일러 이름으로 결과를 필터링하려는 경우

, 나는이 쿼리의 결과에 항목 쿼리의 결과를 가입하려는 :

var filerNameQuery = session.Query<NameLinkToFiler>() 
.Where(q=>q.SearchName.Contains('some name')); 

나는 NameLinkToFiler의 결과를 원한다. Filer 속성을 사용하여 Item.Filing.Filer 속성을 조인하므로 반환 된 항목 목록이 축소됩니다.

참고 : 위의 '포함'키워드는 설명 된대로 전체 텍스트 색인 검색입니다 (here). 잘 작동하고있어 filerNameQuery가 IQueryable<NameLinkToFiler>이라고 가정 해 봅시다.

select filer.Name, filing.FilingDate, filer.Name, item.Date, item.Amount 
from Search_Name searchNameForFiler, Search_Name searchNameForItem, Name_Link_Filer nameLinkFiler, 
Name_Link_Item nameLinkItem, Item item, Filing filing, Filer filer, Site s 
where 
contains(searchNameForFiler.Name, :filerName) and searchNameForFiler.Id = nameLinkFiler.SearchNameId and nameLinkFiler.FilerId = filer.Id and 
contains(searchNameForItem.Name, :itemName) and searchNameForItem.Id = nameLinkItem.SearchNameId and nameLinkItem.ItemId = item.Id 
and item.FilingId = filing.Id 
and filing.FilerId = filer.Id 
and filing.SiteId = :site 

을 ...하지만 난 쿼리 이런 종류의 컴파일시 검사를 잃고 싶지 않아 :

그것은 바로 SQL에서이 작업을 수행하는 매우 쉽습니다.

감사합니다.

답변

7

명백하게 대답은 람다 구문을 사용하지 않는 것입니다.

이 잘 작동 :

query = from t in parentItemQuery 
    join l in Session.Query<NameLinkToFiler>() on t.Filing.Filer.Id equals l.Filer.Id 
    join n in Session.Query<SearchName>() on l.SearchName.Id equals n.Id 
    where sn.Contains(request.FilerName) 
    select t; 
+0

는 RadimKöhler @ - 이봐, 난 사람 ...의 공유 친절 해요, 난 당신이 무엇을 즐기시나요, 심각) –

+0

. 영감을 얻고 있습니다 ... 나는 좀 더 집중적 인 전체 텍스트 사용법에 대해서도 생각하고있었습니다. 좋은;) –