我有一个项目列表(不会更改),因此使用 NHibernate 查询它并转换为如下所示的内存列表
List<Items> myItems = _repository.All().ToList();
稍后当用户进行搜索并单击搜索按钮时,我会在下面执行
myItems.Where(item => item.Name == searchTerm)
我看到第一个代码导致以下查询(等效不准确)
SELECT * FROM Items
然后第二个代码对数据库造成另一次命中,即使它在内存对象中。
SELECT * FROM Items Where Name = 'Stackoverflow'
我该怎么做才能停止不必要的查询?
每个 item 可以属于多个用户,因此 Item 具有如下映射
HasMany(x => x.Users).KeyColumn("UserId");
在显示拥有项目的用户数量的页面中,我有如下代码
foreach(Item item in AllItems)
{
var itemName = item.Name;
var itemUserCount = item.Users.Count;
}
上面导致对用户表的 N 次查询,即如果项目计数 = 100,则在用户表上执行 100 次查询以获取计数。
How do i optimize the above mapping to work efficiently?
资源:
http://www.hibernatingrhinos.com/products/nhprof/learn/alert/SelectNPlusOne