私の現在のプロジェクトでは、NHibernate 3.0b1 とNHibernate.Linq.Query<T>()
API を使用しています。私は LINQ にはかなり精通していますが、HQL や ICriteria API の経験はまったくありません。私のクエリの 1 つが IQueryable API でサポートされていないため、以前の API のいずれかを使用する必要があると思いますが、どこから始めればよいかわかりません。
ICriteria の優れた「入門」ガイドを Web で検索してみましたが、ここで適用するには単純すぎるか、高度すぎて理解できない例しか見つかりませんでした。良い教材をお持ちの方がいらっしゃいましたら、よろしくお願いいたします。
いずれにせよ、クエリを実行しているオブジェクト モデルは次のようになります (大幅に簡略化され、関連性のないプロパティは省略されています)。
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; }
}
Aには、その歴史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>()
メソッドにより、 aNotSupportedException
がスローされます。代わりに ICriteria を使用してこれを行うことはできますか?