Я пытаюсь запросить IList <string> свойство на одном из моих классов домена с использованием NHibernate. Вот простой пример для демонстрации:
public class Demo
{
public Demo()
{
this.Tags = new List<string>();
}
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<string> Tags { get; set; }
}
Отображается следующим образом:
<class name="Demo">
<id name="Id" />
<property name="Name" />
<bag name="Tags">
<key column="DemoId"/>
<element column="Tag" type="String" />
</bag>
И я могу сохранить и получить просто отлично. Теперь для запроса экземпляров моего класса домена, где свойство Tags содержит указанное значение:
var demos = this.session.CreateCriteria<Demo>()
.CreateAlias("Tags", "t")
.Add(Restrictions.Eq("t", "a"))
.List<Demo>();
Результаты в ошибке: коллекция не была ассоциацией: Demo.Tags
var demos = (from d in this.session.Linq<Demo>()
where d.Tags.Contains("a")
select d).ToList();
Результат ошибки: ссылка на объект objct не установлена в экземпляр объекта.
var demos = this.session.CreateQuery("from Demo d where :t in elements(d.Tags)")
.SetParameter("t", "a")
.List<Demo>();
Работает нормально, но поскольку мой настоящий класс домена имеет много свойств, и я создаю сложный динамический запрос, выполнение уродливых манипуляций с строками не является моим первым выбором. Я бы предпочел использовать ICriteria или Linq. У меня есть пользовательский интерфейс, в котором можно ввести много разных возможных критериев поиска. Код, который сейчас создает ICriteria, длится десятки строк. Я действительно ненавижу превращать это в манипуляции с строкой HQL.