У меня есть предметы. Каждый элемент принадлежит группе. И каждый элемент имеет (возможно, пустой) список тегов (строк), полезных для ускорения текстового поиска. Поиск должен найти элементы, соответствующие их описанию, описанию группы, к которой они принадлежат, или одному или нескольким тегам (все в условиях ИЛИ).
Я пытаюсь выбрать элементы по ключу поиска через следующий QueryOver.
Item i = null;
ItemGroup g = null;
String tag = null;
session
.QueryOver<Item>(() => i)
.JoinAlias(x => x.Group, () => g, JoinType.InnerJoin)
.JoinAlias(x => x.Tags, () => tag, JoinType.LeftOuterJoin) //left outher join because it is possible for an item to have no tags at all.
.Where(
new Disjunction()
.Add(Restrictions.On(() => p.Description).IsInsensitiveLike(searchKey, MatchMode.Anywhere))
.Add(Restrictions.On(() => g.Description).IsInsensitiveLike(searchKey, MatchMode.Start))
.Add(Restrictions.On(() => tag).IsInsensitiveLike(searchKey, MatchMode.Start)) //this condition throws an exception
)
.Take(maxResults)
.Future();
Класс элемента отображается следующим образом:
<class name="Item" table="Items">
<id name="Id">
<generator class="guid.comb" />
</id>
<natural-id>
<property name="Code" not-null="true" />
</natural-id>
<property name="Description" not-null="true" />
<many-to-one name="Group" column="ID_Group" not-null="true" fetch="join" />
<property name="ExpiryDate" />
<list name="Tags" table="Items_Tags">
<key column="ID_Item" />
<index column="Idx" />
<element column="Tag" />
</list>
</class>
Выполнение запроса вызывает исключение NullReferenceException. При удалении последнего условия в дизъюнкции исключение не выбрасывается.
Я не избавился от этого без использования волшебных строк.