2012-02-21 64 views
2

我有一個查詢由QueryOver:NHibernate的QueryOver由枚舉標誌

public IList<Person> SearchTest(PersonEnumType type) 
{ 
    var q = SessionInstance.QueryOver<Person>(); 
    q = q.Where(x => (x.PersonEnumType & type) == type); 
    return q.List<Person>(); 
} 

PersonEnumType是一個枚舉標誌:

[Flags] 
public enum PersonEnumType 
{ 
    Employee1 = 1, 
    Employee2 = 2, 
    Employee3 = 4 
} 

這將引發Could not determine member from (Convert(x.PersonEnumType) & Convert(value(NHibernate.Repository.PersonRepositoryNh+<>c__DisplayClass2).type))

當然這部作品在NHibernate的。 LINQ。

爲什麼?

+0

我的猜測是,與Linq的操作是在內存中完成,因此它將首先加載所有人,然後在內存中執行x.PersonEnumType&type過濾。或者,也許linq提供商就是這麼好。無論如何[你可以做它使用ICriteria](http://stackoverflow.com/questions/1835392/hql-to-criteriaquery-when-using-bitwise-operators) – 2012-02-21 16:42:35

回答

1

如果你已經在你的映射文件正確映射你的財產:

<property name="PersonEnumType" type="MyApp.PersonEnumType, MyApp"> 
    <column name="Person" default="1" /> 
</property> 

你可以實現你要尋找的使用過濾器。
我不知道這是唯一的解決方案,但是,這裏有雲:

您可以創建一個過濾器定義:

<filter-def name="PersonEnumTypeFilter"> 
    <filter-param name="personType" type="MyApp.PersonEnumType, MyApp"/> 
</filter-def> 

,並在你的類映射實現:

<filter name="PersonEnumTypeFilter" condition="(:personType &amp; PersonEnumType) = PersonEnumType"/> 

現在你可以在你的過濾器進行切換:

public IList<Person> SearchTest(PersonEnumType type) 
{ 
    SessionInstance.EnableFilter("PersonEnumTypeFilter").SetParameter("personType", type); 
    var q = SessionInstance.Query<Person>(); 
    return q.ToList<Person>(); 
} 

你可以閱讀更多關於過濾器here

+0

唯一的問題是,他不想使用==但相反& – 2012-02-21 16:34:28

+0

@ToniParviainen:謝謝。我誤讀了。 – LeftyX 2012-02-21 18:04:40