Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用反射从属性的_C#_Linq_Nhibernate_Reflection_Collections - Fatal编程技术网

C# 如何使用反射从属性的

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

我在一个应用程序中使用nhibernate,我有一个带有一些关系的映射模型。这些关系映射到
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
方法需要整个列表来应用搜索模式(即使它是空的)。

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

如果在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不会初始化集合。您可能会在调试器中看到这一点,但强制它的是手表。