Fluent nhibernate 为什么这个FluentNHibernate查询会加载所有内容?
我有以下疑问:Fluent nhibernate 为什么这个FluentNHibernate查询会加载所有内容?,fluent-nhibernate,Fluent Nhibernate,我有以下疑问: MyRepository.Query<MyObject>().SingleOrDefault(x => x.AProperty == aValue); 它返回正确的MyObject,但它开始花费越来越多的时间。当我使用SQL Server Profiler查看时,我看到它通过从数据库中为MyObject和相关对象选择一行和一行来加载数据库中的所有MyObject。当数据库增长时,对于一个非常简单的查询,这将变成成千上万的选择 另一方面,此查询: Session
MyRepository.Query<MyObject>().SingleOrDefault(x => x.AProperty == aValue);
它返回正确的MyObject,但它开始花费越来越多的时间。当我使用SQL Server Profiler查看时,我看到它通过从数据库中为MyObject和相关对象选择一行和一行来加载数据库中的所有MyObject。当数据库增长时,对于一个非常简单的查询,这将变成成千上万的选择
另一方面,此查询:
Session.QueryOver<MyObject>().Where(x => x.AProperty == aValue).SingleOrDefault<MyObject>()
不会加载所有内容,而是创建一个select语句,而不是数千个
为什么??有没有办法告诉查询不要加载所有内容?或者这就是Linq查询的工作方式?我问这个问题的原因是我有一个应用程序,其中所有查询都是使用Query进行的。将其更改为QueryOver需要一些工作。有什么想法吗
一些细节:
查询是NHibernate.Linq命名空间NHibernate v 3.1.0.4000的扩展方法
我的FluentNHibernate版本是1.2.0.712
我有这样的约定:Conventions.AddFluentNHibernate.Conventions.Helpers.DefaultLazy.Never;
经过一天多的研究,我终于意识到了这个问题。这确实很简单,但从问题中的信息很难回答。如果其他人也有同样的经历,这里是正确的答案 MyRepository有这样一个方法
public List<T> Query<T>() where T : DomainEntity
{
using (var session = _sessionSource.CreateSession())
{
using (var transaction = session.BeginTransaction())
{
var result = session.Query<T>();
transaction.Commit();
return result.ToList();
}
}
}
这意味着我首先用session.Query加载所有内容,然后用MyRepository.Query.SingleOrDefaultx=>x.apProperty==aValue查询结果;
.
当然,非常糟糕。复制别人的代码并不总是明智的
如何避免呢?只是不要质疑一个问题