【问题标题】:How to call a method from of a property using Reflection如何使用反射调用属性的方法
【发布时间】:2013-05-15 20:42:41
【问题描述】:

我在应用程序中使用 nhibernate,并且我有一个具有一些关系的映射模型。这些关系与List<T> 映射,我需要将一个实体传递给一个方法并调用Any() 方法来检查每个关系上是否有寄存器。

我尝试这样做,但是当我从 PropertyInfo 调用 GetValue() 方法时,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,我该如何使用反射来做到这一点?!

【问题讨论】:

  • 修正你的标题;它与您的问题不符。
  • 您是否将您的 NHibernate 属性/集合定义为延迟加载?
  • @Chris Sinclair,是的,这是延迟加载!

标签: c# linq nhibernate reflection collections


【解决方案1】:

在集合上调用Enumerable.Any() 会导致初始化,因为实现会读取是否有元素。

相比之下,如果您使用lazy="extra" 映射您的集合,您可以检查Count == 0(这是一个ICollection&lt;T&gt; 方法,如果您使用dynamic,您可以轻松调用它。

或者,您可以安装NHibernate.CollectionQuery,使用可查询的集合类型映射您的集合,然后调用collection.AsQueryable().Any()

【讨论】:

  • 您好 Diego,但是如果不从 propertyInfo 对象调用 .GetValue 方法,我怎么能使用反射呢?当我调用 GetValue 时,nhibernate 将执行我的关系实体的完整查询... :(
  • GetValue 不初始化集合。您可能会在调试器中看到这一点,但强制它的是手表。
【解决方案2】:

Any 是一个扩展方法,所以如果你想找到它,查看这个帖子: Reflection to Identify Extension Methods

但 Entity 仍然会加载整个列表,因为 Any 方法需要整个列表来应用搜索模式(即使它是空的)。

【讨论】:

  • 嗨@ppetrov,你是对的,我知道Any() 方法会点击一个查询来检查而不是加载所有内容.. 我也可以调用Count() 方法,但我会点击一个select count(*)... 在数据库上,我更喜欢 select top 1 ... 并且任何方法都能成功!我会检查你的链接,谢谢!
  • 我不确定Any 方法是否会生成select top 1,因为它在IEnumerable 上运行,因此在已加载的列表上运行。 Entity Framework 是否重载此方法以生成select top 1 语句?
【解决方案3】:

您将 IQueryable Any() 扩展方法与 IEnumerable Any() 扩展方法混为一谈。

如果您在 NHibernate Linq 查询(由 session.Query&lt;EntityType&gt;() 开始)中调用 Any(),NHibernate 会发现您只想知道是否有一个元素。它可以这样做,因为在这种情况下,您使用的是IQueryable 的扩展方法,并且正在创建一个表达式树,而不是执行扩展方法中的代码。

但是,如果您在实体内的持久集合上调用Any(),则只会执行扩展方法的代码。 NHibernate 将其视为对集合的任何其他访问并加载整个集合。

【讨论】:

  • 嗨@cremor,但是我怎么能通用地调用这个方法呢?!
猜你喜欢
  • 2011-07-19
  • 2016-06-28
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
相关资源
最近更新 更多