C# 如何使用反射从属性的
我在一个应用程序中使用nhibernate,我有一个带有一些关系的映射模型。这些关系映射到C# 如何使用反射从属性的,c#,linq,nhibernate,reflection,collections,C#,Linq,Nhibernate,Reflection,Collections,我在一个应用程序中使用nhibernate,我有一个带有一些关系的映射模型。这些关系映射到List,我需要将一个实体传递给一个方法,并调用Any()方法来检查每个关系上是否有寄存器 我试着这样做,但是当我从PropertyInfo调用GetValue()方法时,NHibernate将加载所有内容,但我只需要调用Any()方法来提高性能,NHibernate将查询一个简单的查询以进行检查。我试试这个: var type = entity.GetType(); foreach (var proper
List
,我需要将一个实体传递给一个方法,并调用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();
}
var type=entity.GetType();
foreach(type.GetProperties()中的var propertyInfo,其中(p=>typeof(IEnumerable).IsAssignableFrom(p.PropertyType)))
{
//它可以工作,但加载所有内容只是为了检查是否有什么。。。
var collection=propertyInfo.GetValue(实体)作为IEnumerable;
if(集合!=null)
bool has=collection.Any();
}
我想在这里调用IEnumerable.Any(),但在没有GetValue的情况下如何使用反射呢
Any
是一种扩展方法,因此如果您想找到它,请查看以下帖子:
但实体仍将加载整个列表,因为
Any
方法需要整个列表来应用搜索模式(即使它是空的)。您将IQueryableAny()
扩展方法与IEnumerableAny()
扩展方法混为一谈
如果在NHibernate Linq查询中调用Any()
(由session.query()
启动),NHibernate会发现您只想知道是否有一个元素。它可以做到这一点,因为在这种情况下,您使用的是IQueryable
的扩展方法,并创建一个表达式树,而不是在扩展方法中执行代码
但是,如果在实体内的持久集合上调用
Any()
,这将只执行扩展方法的代码。NHibernate将此视为对集合的任何其他访问,并加载整个集合。调用Enumerable。集合上的任何()
都将导致初始化,因为实现将读取以查看是否存在元素
相反,如果使用lazy=“extra”
映射集合,则可以检查Count==0
(这是一种ICollection
方法,如果使用动态
,则可以轻松调用它
或者,您可以安装,使用queryable集合类型映射集合,并调用
collection.AsQueryable().Any()
修复您的标题;它与您的问题不匹配。您是否已将您的NHibernate属性/集合定义为延迟加载?@Chris Sinclair,是的,它是延迟加载!您好@ppetrov,您好,我知道Any()
方法将命中一个查询以检查而不是加载所有内容。我还可以调用Count()
方法,但我将点击一个选择计数(*)…
在数据库上,我预先选择选择top 1…
并且任何方法都会点击它!我将检查您的链接,谢谢!我不确定任何方法是否会生成选择top 1
,因为它在IEnumerable
上操作,所以在已经加载的列表上。Entity Framework是否会重载此方法以生成selecttop1
语句?Hi@cremor,但是我怎么能一般地调用这个方法?!Hi Diego,但是我怎么能使用反射而不调用propertyInfo对象中的.GetValue
方法呢?当我调用GetValue时,nhibernate将执行我的关系实体的完整查询…:(GetValue不会初始化集合。您可能会在调试器中看到这一点,但强制它的是手表。