考虑以下“数据库”:
Post -> User
实体:
class User
{
public virtual string Name { get; set; }
public virtual IList<Post> Posts { get; set; }
}
class Post
{
public virtual string Title { get; set; }
public virtual User Author { get; set; }
}
以下服务层:
class UserService
{
IRepositoryUsers repositoryUsers;
IList<User> GetUsers()
{
return this.repositoryUsers.GetAllUsers();
}
}
当我想要打印所有用户,并且有相关的帖子计数时,我得到(这并不奇怪)一个N + 1选择问题,对于每一行,它会创建一个选择来获取用户的帖子。
现在我的问题是:处理此问题的“最佳”方式是什么,因为在某些情况下我不想急切加载每个用户的帖子。
我应该在我的存储库(和服务)中创建尽可能多的方法来匹配这些场景吗?
答案 0 :(得分:1)
一般来说,有几种方法可以消除选择N + 1问题。使用NHibernate,我最喜欢的方法之一是使用Criteria API,这是非常明智和深思熟虑的。
session.CreateCriteria(typeof(Fruit)) // Get me some fruit.
.SetFetchMode("CitrusType", FetchMode.Eager) // Just get this one field.
.Add(Expression.Eq("Basket", 47)) // Only fruit that are in this basket.
.List(); // Get 'em all.
要详细了解此策略和其他策略,建议您查看此interesting blog post。
答案 1 :(得分:0)