2012-01-30 96 views
3

我有兩個實體EntityA和EntityB。數據庫中的EntityB具有對EntityA.Id的FK引用,因此對於EntityA中的每一行,EntityB中都有可能爲零,一行或多行。通常這被簡稱爲一對多關係。LINQ to NHibernate,如何做這個查詢

我有NHibernate的3.2映射像這樣我的兩個實體:

<class name="EntityA" table="EntityA"> 
    <id name="Id" type="Guid" column="id"> 
     <generator class="guid.comb" /> 
    </id> 
    <set name="EntityBs" lazy="false" inverse="true" cascade="all" table="EntityB"> 
     <key column="id" /> 
     <one-to-many class="EntityB" /> 
    </set> 
    <properties... 
</class> 
<class name="EntityB" table="EntityB"> 
    <id name="Id" type="Guid" column="id"> 
     <generator class="guid.comb" /> 
    </id> 
    <many-to-one name="EntityA" class="EntityA" column="entityAId" /> 
    <properties... 
</class> 

我無法弄清楚如何寫這個LINQ查詢。我希望EntityA的所有行在EntityB中沒有任何行,並且對EntityA有一個外鍵引用。

基礎上,我發現我已經試過這樣的其他例子:

var results = 
       nhSession.Query<EntityA>() 
       .Where(x => !x.EntityBs.Any()).ToList(); 

我想要什麼LINQ到NHibernate的發射是一樣的東西:

SELECT 
    id, 
    column1, 
    column2, 
    etc.. 
FROM EntityA 
WHERE id NOT IN (
    SELECT entityAId 
    FROM EntityB 
) 

任何幫助任何人都可以提供非常感謝,謝謝。

回答

1

如果您在EntityA和EntityB之間建立雙向關係更容易。 (抱歉,NHForge目前處於關閉狀態,否則我會將您鏈接到一些文檔)。

然後,你可以這樣寫查詢:

Session.Query<EntityA> 
    .Where(x => !x.EntityBs.Any()) 
    .ToList(); 

這樣做沒有雙向映射是很難在LINQ的 - 我會用個createCriteria或HQL來代替。

+0

我添加了雙向關係。我將編輯我上面的原始問題以反映這個想法。但是,查詢不起作用。它什麼都不選,即使它應該。 – tnktnk 2012-01-30 06:12:02

+0

好的,我弄清楚了ISet是錯誤類型的另一個障礙,現在我看到它正在生成的查詢,它完全錯誤,我不知道LINQ語法會產生正確的查詢。我想我必須放棄這個方向。儘管感謝您的回覆。 – tnktnk 2012-01-30 06:46:57

+0

你能發佈你正在尋找的確切的SQL查詢嗎? – cbp 2012-01-30 08:10:51