0

アプリケーションで nhibernate を使用しており、いくつかの関係を持つマップされたモデルがあります。これらのリレーションはマッピングされてList<T>おり、エンティティをメソッドに渡し、メソッドを呼び出して、Any()各リレーションにレジスタがあるかどうかを確認する必要があります。

私はそれをやろうとしましたがGetValue()、PropertyInfo からメソッドを呼び出すと、NHibernate はすべてをロードしますが、メソッドを呼び出すだけAny()でパフォーマンスが向上し、nhibernate はチェックするためだけに単純なクエリをクエリします。私はこれを試します:

var type = entity.GetType();
foreach (var propertyInfo in type.GetProperties().Where(p => typeof (IEnumerable<>).IsAssignableFrom(p.PropertyType)))
{
   // it works, but load everything just to check if there are something...
   var collection = propertyInfo.GetValue(entity) as IEnumerable<dynamic>;

   if (collection != null)
      bool has = collection.Any();

}

ここで IEnumerable.Any() を呼び出したいのですが、GetValue なしでリフレクションを使用してこれを行うにはどうすればよいでしょうか?!

4

3 に答える 3

1

コレクションを呼び出すEnumerable.Any()と、要素があるかどうかを確認するために実装が読み取られるため、初期化が発生します。

対照的に、コレクションをマップすると、lazy="extra"チェックできますCount == 0ICollection<T>メソッドです。を使用すると簡単に呼び出すことができますdynamic

または、 NHibernate.CollectionQueryをインストールし、クエリ可能なコレクション型を使用してコレクションをマップし、 を呼び出しますcollection.AsQueryable().Any()

于 2013-05-16T12:01:40.130 に答える
0

IQueryableAny()拡張メソッドと IEnumerableAny()拡張メソッドを混同しています。

Any()NHibernate Linq クエリ ( で始まる)を呼び出すと、NHibernatesession.Query<EntityType>()は、1 つの要素があるかどうかだけを知りたいことを認識します。これを行うことができるのは、その場合、拡張IQueryableメソッド内でコードを実行する代わりに、拡張メソッドを使用して式ツリーを作成しているためです。

ただし、エンティティ内の永続的なコレクションを呼び出すAny()と、拡張メソッドのコードが実行されるだけです。NHibernate は、コレクションへの他のアクセスと同様にこれを認識し、コレクション全体をロードします。

于 2013-05-16T05:55:59.610 に答える