NHibernate を使用して、ドメイン クラスの 1 つで IList<string> プロパティに対してクエリを実行しようとしています。以下に簡単な例を示します。
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();
エラーが発生します: オブジェクト参照がオブジェクトのインスタンスに設定されていません。
var demos = this.session.CreateQuery("from Demo d where :t in elements(d.Tags)")
.SetParameter("t", "a")
.List<Demo>();
正常に動作しますが、私の実際のドメイン クラスには多くのプロパティがあり、複雑な動的クエリを作成しているため、醜い文字列操作を行うことは私の最初の選択肢ではありません。私はICriteriaまたはLinqを使用したいと思っています。さまざまな検索基準を入力できるユーザー インターフェイスがあります。現在、ICriteria を構築するコードは、数十行の長さです。それをHQL文字列操作に変えるのは本当に嫌です。