2

У меня есть запрос на QueryOver:Nhibernate QueryOver по Enum Флаги

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

и PersonEnumType является Enum флаги:

[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) –

ответ

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

Смежные вопросы