2014-01-13 12 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); 

ザ・接続するサイト合流 - >ファイラ - >ファイリングを - > Itemは私のマッピングでうまくいっていますが、ユーザー入力に基づいてNameLinkToFilerまたはNameLinkToItemクラスに参加しようとすると問題が発生します。

ユーザーがクエリファイラ名となりフィルタリングしたい場合、私はこのクエリの結果を項目クエリの結果を参加したい:

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

私はNameLinkToFilerの結果が欲しいです。 FilerプロパティをItem.Filing.Filerプロパティに追加すると、返されたアイテムのリストが縮小されます。

注:上記の 'Contains'キーワードは、私が使用している全文索引検索ですhereです。うまくいきました。filerNameQueryがIQueryable<NameLinkToFiler>であると仮定しましょう。

それはまっすぐなSQLでこれを行うには非常に簡単です:

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 

...しかし、私は、クエリのこの種のためにコンパイル時のチェックを失いたくありません。

ありがとうございました。

答えて

7

明らかに、答えはラムダ構文を使用しないことです。

これは正常に動作します:RadimKö[email protected]

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

- ...ねえ、私は男の共有一種だ。真剣に) –

+0

、私はあなたが何を楽しんでください。感動しています...私は、より集中的なフルテキストの使用についても考えていました。素敵;) –

関連する問題