2009-06-26 110 views
0

我試圖使用標準API過濾一列值。我懷疑這是不可能的,我只是在這裏問一下確定。NHibernate:使用標準對值列表進行查詢過濾

class Entity 
{ 
    int id { get; set; } 
    IList<Guid> Guids { get; set; } 
} 

映射:

<class name="Entity"> 
    <id ...></id> 
    <bag name="Guids" table="Entity_Guids"> 
    <key column="Entity_FK"/> 
    <element column="Guid"/> 
    </bag> 
</class> 

認爲我有GUID列表(實際上這是另一個子查詢)。我想過濾Guid列表中至少有一個guid的所有實體。

SQL就像這樣:

SELECT * 
FROM Entity e 
    inner join Entity_Guids eg 
    on e.id = eg.Entity_FK 
WHERE 
    eg.Guid in (subquery) 

隨着標準的API,這似乎是不可能的。

ICriteria query = session 
    .CreateCriteria(typeof(Entity), "e") 
    .Add(Subqueries.In("e.Guids", subquery)) 

引發異常。

+0

例外呢? – MatthieuGD 2009-06-27 22:19:56

+0

和子查詢是detachedcriteria? – MatthieuGD 2009-06-27 22:21:00

回答

1

您的查詢不起作用,因爲傳遞給子查詢的e.Guids屬性不是單個值。要做到這一點,你實際上試圖執行一個交集並檢查該交集不是空的,但不幸的是在條件api中不存在,儘管你可以用Linq做這個。

你也許仍然這樣做,如果你的GUID是適當的屬性(Value屬性包含實際的GUID)實體,並有一個雙向關係:

var subquery2 = DetachedCriteria.For<GuidEntity>() 
    .Add(Subqueries.In("Value", subquery)) 
    .SetProjection("Entity_FK"); 

ICriteria query = session.CreateCriteria(typeof (Entity)) 
    .Add(Subqueries.In("Id", subquery2));