2012-02-21 103 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