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에서이 작업을 수행하는 매우 쉽습니다.
감사합니다.
는 RadimKöhler @ - 이봐, 난 사람 ...의 공유 친절 해요, 난 당신이 무엇을 즐기시나요, 심각) –
. 영감을 얻고 있습니다 ... 나는 좀 더 집중적 인 전체 텍스트 사용법에 대해서도 생각하고있었습니다. 좋은;) –