2013-08-27 6 views
1

надуманный пример, но, скажем, у меня есть эти объекты:Можно ли использовать фильтры NHibernate для фильтрации через ссылки?

public class Root 
{ 
    public virtual Customer Customer { get; set; } 
} 

public class Customer 
{ 
    public virtual CustomerData Data { get; set; } 
} 

public class CustomerData 
{ 
    public virtual string FooName { get; set; } 
} 

Теперь, скажем, я хочу, чтобы создать фильтр для Root на основе значения FooName. Интуитивно я пробовал это в своем классе FooMap. Использование Fluent-сопоставлений.

ApplyFilter("FooNameFilter", "Customer.Data.FooName in (:argument)"); 

Это не работает. A SqlClient.SqlException указано, что The multi-part identifier "Customer.Data.FooName" could not be bound.

Есть ли способ заставить фильтры работать таким образом, или я вынужден переместить эту логику во все Query<Root>() s вместо этого?

+1

Мои ставки находятся на том, чтобы переместить логику в ваших запросов. Насколько я понимаю, фильтры - это SQL, а не HQL, поэтому вы не сможете использовать этот интуитивно понятный синтаксис 'Customer.Data.FooName'. Я думаю, что фильтры должны быть только столбцами, которые определены в этой таблице. –

+0

Вот чего я боюсь. Меня не задирает, но мне очень понравился API-фильтр для того, что я делал. –

ответ

1

Что может быть полезным, это переместить filter в объект CustomerData, если это возможно, или создать «более сложное условие SQL», применяемое к сопоставлению Customer. Но речь идет о чистом SQL, никаких ссылок. Как работают фильтры?

filters те же, что и в предложении where, но могут быть скорректированы во время выполнения. Выписка из документации 18.1. NHibernate filters

NHibernate добавляет возможность заранее определить критерии фильтрации и придают эти фильтры как на уровне класса и уровня собираемости. Критерии - это способность определять предложение ограничения, очень похожее на , на существующий атрибут «где», доступный для класса и различные элементы коллекции . Кроме этих условий фильтра может быть параметризован параметр . Затем приложение может принять решение во время выполнения , должны ли данные фильтры быть включены и каковы их значения параметра . Фильтры могут использоваться как представления базы данных, но параметризуются внутри приложения.

Определение where:

где (по желанию) указать произвольный SQL WHERE условие для использования при получении объектов этого класса

Другими словами, эти настройки действуют как «добавить» к нашему отображению. Они расширяют его (и where и filter) с более SQL balast. Фильтр может быть общим для многих отображений и применяется ко всем запросам внутри одной сессии, но она должна быть ориентирована на столбец:

condition=":myFilterParam = MY_FILTERED_COLUMN" 
+0

Учитывая сообщение об ошибке, я понял, что это происходит под обложками. Что я еще не уверен в том, могу ли я сделать эту работу с фильтрами. Я не уверен, как фильтрация CustomerData помогает, когда я хочу фильтровать запросы против Root. Я довольно новичок в NHibernate, поэтому я не уверен, что все мои варианты еще нет. –

+0

Суть фильтра в основном заключается в обработке коллекции.Вы можете иметь большую коллекцию или зависящую от культуры, имя пользователя и т. Д. В этих случаях можно использовать фильтр. Вы узнаете, что является ограничением для текущего сеанса (культура пользователей), и вы можете установить его на сеанс. Все коллекции будут отфильтрованы с этой настройкой. Но в случае, если вы хотите получить Customer, у которого есть некоторые настройки ... используйте Criteria или QueryOver api. Вы будете «присоединяться» к данным клиента и применять фильтр во время запроса. –

+0

. Есть несколько ссылок на эту тему, когда я попытался объяснить, как использовать фильтр: http://stackoverflow.com/a/17109300/1679310, http: // stackoverflow.com/a/14378253/1679310 –

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