[英]How to call a method from of a property using Reflection
我在應用程序中使用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的情況下使用反射來執行此操作?!
Any
是一種擴展方法,所以如果你想找到它,請查看這篇文章: 反映識別擴展方法
但實體仍會加載整個列表,因為Any
方法需要整個列表來應用搜索模式(即使它是空的)。
在集合上調用Enumerable.Any()
將導致初始化,因為實現會讀取以查看是否存在元素。
相反,如果你用lazy="extra"
映射你的集合,你可以檢查Count == 0
(這是一個ICollection<T>
方法,如果你使用dynamic
,你可以輕松調用它。
或者,您可以安裝NHibernate.CollectionQuery ,使用可查詢的集合類型映射集合,並調用collection.AsQueryable().Any()
。
您正在將IQueryable Any()
擴展方法與IEnumerable Any()
擴展方法混合使用。
如果你在NHibernate Linq查詢中調用Any()
(由session.Query<EntityType>()
),NHibernate會發現你只想知道是否有一個元素。 它可以這樣做,因為在這種情況下,您正在使用IQueryable
的擴展方法,並且正在創建表達式樹而不是在擴展方法中執行代碼。
但是如果在實體內部的持久集合上調用Any()
,則只執行擴展方法的代碼。 NHibernate看到這就像對集合的任何其他訪問一樣,並加載整個集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.