假设我们在数据模型中有四个实体:类别、书籍、作者和 BookPages。还假设 Categories-Books、Books-Authors 和 Books-BookPages 关系是一对多的。
如果从数据库中检索到类别实体实例——包括“Books”、“Books.BookPages”和“Books.Authors”——这将成为一个严重的性能问题。此外,不包括它们将导致“对象引用未设置为对象的实例”异常。
使用多个 Include 方法调用的最佳实践是什么?
- 编写单个方法 GetCategoryById 并包含其中的所有项目(性能问题)
- 编写单个方法 GetCategoryById 并发送要包含的关系列表(也许,但似乎仍然不够优雅)
- 编写 GetCategoryByIdWithBooks、GetCategoryByIdWithBooksAndBooksPages 和 GetCategoryByIdWithBooksAndAuthors 等方法(不实用)
编辑:第二个选项我的意思是这样的:
public static Category GetCategoryById(ModelEntities db, int categoryId, params string[] includeFields)
{
var categories = db.Categories;
foreach (string includeField in includeFields)
{
categories = categories.Include(includeField);
}
return categories.SingleOrDefault(i => i.CategoryId == categoryId);
}
调用时,我们需要这样的代码:
Category theCategory1 = CategoryHelper.GetCategoryById(db, 5, "Books");
Category theCategory2 = CategoryHelper.GetCategoryById(db, 5, "Books", "Books.Pages");
Category theCategory3 = CategoryHelper.GetCategoryById(db, 5, "Books", "Books.Authors");
Category theCategory4 = CategoryHelper.GetCategoryById(db, 5, "Books", "Books.Pages", "Books.Authors");
这种方法有什么明显的缺点吗?