我有以下查询:
MyRepository.Query<MyObject>().SingleOrDefault(x => x.AProperty == aValue);
它返回正确的MyObject,但它开始花费越来越多的时间。当我查看SQL Server Profiler时,我看到它在数据库中加载了 all 我的MyObjects,方法是从数据库中为MyObject和相关对象选择一行和一行。当数据库增长时,对于非常简单的查询,这会变成成千上万的选择。
另一方面,这个查询:
Session.QueryOver<MyObject>().Where(x => x.AProperty == aValue).SingleOrDefault<MyObject>()
不会加载所有内容(它会创建一个select语句而不是数千个)。
为什么呢?有没有办法告诉Query不要加载所有内容?或者这就是Linq查询的工作原理?我问的原因是我有一个应用程序,其中所有查询都是使用Query进行的。将其更改为QueryOver需要一些工作。有什么想法吗?
一些细节:
答案 0 :(得分:0)
看了这一天超过一天我终于意识到了这个问题。这真的很简单,但很难从问题中的信息中回答。如果其他人遇到同样的问题,这是正确的答案;
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<T>()
),然后只查询结果(使用MyRepository.Query<MyObject>().SingleOrDefault(x => x.AProperty == aValue);
。
当然,非常糟糕。复制他人的代码并不总是很聪明......
如何避免它?只是不要查询查询。