2

私のドメイン (および 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 プロバイダーでこのようなことが可能かどうか知っていますか?

どうもありがとう

4

1 に答える 1

0

これが役立つかどうかはわかりません...

NH 2.2 から 3.3.2 にアップグレードしたところ、以前は NH 2.2 で NH.Linq プロバイダーを使用して正常に動作していた特定の SelectMany クエリで同じエラーが発生しました。

私のNH 2.2(動作中)クエリは次の形式でした:

Session.Query<T>().SelectMany(o => o.DictionaryProperty.Values)

NH 3.3.2 で次のエラーが発生します。

cannot dereference scalar collection element: Values

クエリを次のように変更することで、機能させることができました。

Session.Query<T>().SelectMany(o => o.DictionaryProperty).ToList().Select(kvp => kvp.Value)

これにより、辞書値へのアクセスが Linq-to-NHibernate から Linq-to-Objects に効果的に移動します。ここで何が起こっているのかまだわかりません...

于 2012-12-20T18:51:45.750 に答える