В моем текущем проекте используется NHibernate 3.0b1 и API NHibernate.Linq.Query<T>()
. Я довольно свободно владею LINQ, но у меня нет абсолютно никакого опыта работы с HQL или API ICriteria. Один из моих запросов не поддерживается API IQueryable, поэтому я предполагаю, что мне нужно использовать один из предыдущих API-интерфейсов, но я не знаю, с чего начать.Как выразить этот запрос LINQ с помощью API NHibernate ICriteria?
Я попытался найти в Интернете хорошее руководство по началу работы с ICriteria, но единственные примеры, которые я нашел, либо слишком упрощены, либо применимы здесь, либо слишком передовые для меня, чтобы понять. Если у кого-то есть хорошие учебные материалы, они будут очень благодарны.
В любом случае, объектная модель я запрашивая против выглядит следующим образом (значительно упрощено, нерелевантное свойство опущена):
class Ticket {
IEnumerable<TicketAction> Actions { get; set; }
}
abstract class TicketAction {
Person TakenBy { get; set; }
DateTime Timestamp { get; set; }
}
class CreateAction : TicketAction {}
class Person {
string Name { get; set; }
}
Ticket
имеет коллекцию TicketAction
с описанием его истории. TicketAction
подтипы включают CreateAction
, ReassignAction
, CloseAction
и т. Д. Все билеты имеют CreateAction
, добавленные в коллекцию при их создании.
Этот запрос LINQ выполняет поиск билетов, созданных кем-то с указанным именем.
var createdByName = "john".ToUpper();
var tickets = _session.Query<Ticket>()
.Where(t => t.Actions
.OfType<CreateAction>()
.Any(a => a.TakenBy.Name.ToUpper().Contains(createdByName));
Метод OfType<T>()
вызывает NotSupportedException
быть выброшен. Могу ли я сделать это с помощью ICriteria?
Я предпочел бы не добавить обратную ссылку к 'TicketAction'' Ticket', если я могу помочь, так как это приведет к другим проблемам, но спасибо за подсказку. :) –
Другим способом, с которым мы справлялись, было то, что это фактически создавало HQL в построителе строк. Мы попытались использовать выражения Linq для Nhibernate, но они тоже не поддерживают коллекции, когда коллекция находится на стороне объекта. К сожалению, метод «Содержит» не переводит в Linq в nHibernate. – Josh
Я пошел с вашим предложением в конце (добавив ссылку на Ticket on TicketAction), но в итоге у меня возникла ошибка: «NHibernate.QueryException: не удалось разрешить свойство: TakenBy.Имя: CreateAction " –