私が取り組んでいるプロジェクトの場合、Nhibernateでマップされた辞書の値を照会する必要があります。何かのようなもの
SELECT * FROM EntityWithDictionary WHERE EntityWithDictionary 
    in (select EntityFromDictionaryId FROM Dictionary where value = 'testvalue')
私はいくつかのことを試しましたが、どうすればそれができるのかわかりません。これが私が持っているものです。
実在物
public class EntityWithDictionary
{
    public virtual Guid Id { get; set; }
    public virtual string Description { get; set; }
    private IDictionary<string, string> _dictionary = new Dictionary<string, string>();
    public virtual IDictionary<string, string> Dictionary
    {
        get { return _dictionary; }
    }
}
EntityWithDictionary.Dictionaryにあり、値を調べたいと思います。
マッピング:
public EntityWithDictionaryMap()
{
    Id(s => s.Id);
    Map(s => s.Description);
    HasMany(m => m.Dictionary)
        .Table("`Dictionary`")
        .KeyColumn("EntityWithDictionaryId")
        .AsMap<string>("`Key`")
        .Element("`Value`")
        .LazyLoad()
        .Access.CamelCaseField(Prefix.Underscore)
        .Cascade.All();
}
これは私がこれまでに試したことです:
クエリオーバークエリ:
EntityWithDictionary entityWithDictionary = null;
var result = session.QueryOver<EntityWithDictionary>(() =>entityWithDictionary)
        .JoinQueryOver(dictionary =>dictionary.Dictionary)
        .UnderlyingCriteria.Add(Restrictions.Eq("elements", "test")).List();
これにより、次のsql-statement=>が生成されます。
SELECT this_.Id as Id0_0_, this_.Description as Descript2_0_0_ FROM
[EntityWithDictionary] this_ inner join [Dictionary] dictionary3_ on
this_.Id=dictionary3_.EntityWithDictionaryId WHERE dictionary1_.[Value] = @p0 ]
このクエリでは、NHibernateは2つのエイリアス(dictionary1_、dictionary3_)を使用することを選択し、1つだけが作成されます(dictionary3_)。
ICriteria
ICriteria criteria = session.CreateCriteria<EntityWithDictionary>();
criteria("Dictionary").Add(Restrictions.Eq("elements", "testValue"));
var result = criteria.List();
これにより、queryoverと同じSQLクエリが生成され、結果と同じ問題が発生します。
これはhqlで次のようなもので可能であることを知っていますが、ICriteriaのQueryOverでこれを行うにはどうすればよいですか?
from EntityWithDictionaryId e where 'aDictionaryValue' in elements(m.Dictionary).