私のドメイン (および FNH マッピング) の次の抜粋があります。
public class Product
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IDictionary<LimSet, string> Attributes { get; set; }
/*equality logic there*/
}
public class LimSet
{
virtual public int Id { get; set; }
public virtual string Name { get; set; }
/*equality logic there*/
}
internal class LimSetMap : ClassMap<LimSet>
{
public LimSetMap()
{
Table("LIMSET");
Id(x => x.Id).GeneratedBy.Assigned();
Map(x => x.Name);
}
}
internal class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Table("PRODUCT");
Id(x => x.Id).GeneratedBy.Assigned();
Map(x => x.Name);
HasMany(x => x.Attributes)
.AsEntityMap("LIMSET_ID")
.Table("PRODUCT_ATTR")
.KeyColumn("PRODUCT_ID")
.Cascade.AllDeleteOrphan()
.Element("VALUE");
}
}
問題は、別のエンティティをキーとして使用するコンポーネント (これまでの単純な文字列値) のマップ (辞書) にあります。たとえば、データベース スキーマを生成したり、辞書を操作してカスケードで保存したりできます。を使用して Attributes ディクショナリをクエリすると、
var prodWithAttrs = session.Query<Product>()
.Where(p => p.Id == 1)
.SelectMany(p => p.Attributes,
(p, a) => new
{
Product = p.Name,
Attribute = a.Key.Name,
Value = a.Value
});
例外が発生しています
cannot dereference scalar collection element: Key [.SelectMany[Domain.Product,System.Collections.Generic.KeyValuePair`2[...
クエリを言い換える方法をいくつか試しましたが、成功しませんでした。現在の (3.3.2) NH Linq プロバイダーでこのようなことが可能かどうか知っていますか?
どうもありがとう