默认情况下,我在所有模型上都启用了延迟加载,这就是我想保留的方式。但是,有时我想在单个查询上急切地获取所有数据。从我读过的所有内容中,我应该使用FetchMany()
来实现此目的。但是,如果我这样做:
var dbRecipe = (from r in session.Query<Models.Recipes>().FetchMany(x => x.Ingredients)
where r.RecipeId == recipeId
select r).FirstOrDefault();
然后dbRecipe.Ingredients.Count()
返回1.换句话说,它只返回该配方的第一个成分。但是,如果我这样做:
var dbRecipe = (from r in session.Query<Models.Recipes>()
where r.RecipeId == recipeId
select r).FirstOrDefault();
然后dbRecipe.Ingredients.Count()
返回12,这是正确的,但它执行第二次查询以加载该食谱的成分。
如何预先FetchMany
提取所有12个记录?我假设这是Fetch
和FetchMany
之间的区别。我显然做错了什么。
答案 0 :(得分:2)
您可以通过不运行FirstOrDefault
作为最后一个语句来解决此问题。这将导致nh运行top(1)查询,从而产生错误的结果......
而是使用.ToList().FirstOrDefault()
。
或者您使用QueryOver<>
可以正常使用
session.QueryOver<Models.Recipes>()
.Fetch(prop => prop.Ingredients)
.Eager
.Where(p => p.RecipeId == recipeId)
.SingleOrDefault();