2012-02-21 29 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 
} 

これはこれはNHibernateはで動作もちろんCould not determine member from (Convert(x.PersonEnumType) & Convert(value(NHibernate.Repository.PersonRepositoryNh+<>c__DisplayClass2).type))

をスローします。 Linq。

なぜですか?

+0

私の推測では、Linqではメモリ内で操作が行われるため、最初にすべての人物が読み込まれ、メモリ内にx.PersonEnumTypeと型のフィルタリングが行われます。あるいは、linqプロバイダーはそれだけで良いです。とにかく[あなたはICriteriaを使用してそれを行うことができます](http://stackoverflow.com/questions/1835392/hql-to-criteriaquery-when-using-bitwise-operators) –

答えて

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

問題は彼が==を使いたくないということだけです代わりに& –

+0

@ ToniParviainen:ありがとう。私は誤解しました。 – LeftyX