0

私は SharpArch を使用しています。このメソッドを追加してリポジトリを拡張しました。

    public IQueryable<T> FindAll(Expression<Func<T, bool>> expression)
{
  var queryable = Session.Query<T>();
  return queryable.Where(expression);
}

 public IQueryable<T> FindAll(ISpecification<T> specification)
{
  var queryable = Session.Query<T>();
  return specification.SatisfyingElementsFrom(queryable);
}

これで、nibernate.linq でラムダ式と仕様を使用できるようになりました。

 var printers = repository.FindAll(x => x.IpAddress != null).ToList();

私の問題は、エンティティ マップの Not.Lazyload を無視することです。

代わりに、sharpArc が提供する Dictionary で FindAll を使用すると、遅延ロードなしで正しく動作します。

リフレクションを使用すると、次のようになります。

 public virtual IList<T> FindAll(IDictionary<string, object> propertyValuePairs)
{
  Check.Require((propertyValuePairs != null) && (propertyValuePairs.Count > 0), "propertyValuePairs was null or empty; it has to have at least one property/value pair in it");
  ICriteria criteria = this.Session.CreateCriteria(typeof(T));
  foreach (string str in propertyValuePairs.Keys)
  {
    if (propertyValuePairs[str] != null)
    {
      criteria.Add(Restrictions.Eq(str, propertyValuePairs[str]));
    }
    else
    {
      criteria.Add(Restrictions.IsNull(str));
    }
  }
  return criteria.List<T>();
}

ありがとうございました

4

2 に答える 2

0

Session.Query<> の代わりに Session.QueryOver<> を使用してみてください。少し前に読んだ投稿を掘り下げてみますが、正しく覚えていれば、クエリはマッピングのすべての指示を尊重していません。

関連する記事が見つかったら、ここにさらに投稿します...それまでの間、これが役立つことを願っています.

于 2011-06-27T20:01:43.940 に答える
0

あなたの質問は本当に紛らわしいですが、これについてまだ助けが必要であると仮定して、Fetch() メソッドを調べたいと思うかもしれません。

他の人がこの質問に来た場合に備えて、これも投稿しています。

これは、 NHibernate.Linq を使用した Eager fetching に関する非常に優れた記事です。ただし、これがマッピングに問題があるかどうかはわかりません。

于 2011-12-22T20:12:53.020 に答える