如何使用Fluent NHibernate覆盖单个LINQ查询的延迟加载

时间:2013-12-24 22:00:23

标签: c# linq nhibernate fluent-nhibernate

默认情况下,我在所有模型上都启用了延迟加载,这就是我想保留的方式。但是,有时我想在单个查询上急切地获取所有数据。从我读过的所有内容中,我应该使用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个记录?我假设这是FetchFetchMany之间的区别。我显然做错了什么。

1 个答案:

答案 0 :(得分:2)

您可以通过不运行FirstOrDefault作为最后一个语句来解决此问题。这将导致nh运行top(1)查询,从而产生错误的结果......

而是使用.ToList().FirstOrDefault()

或者您使用QueryOver<>可以正常使用

session.QueryOver<Models.Recipes>()
   .Fetch(prop => prop.Ingredients)
   .Eager
   .Where(p => p.RecipeId == recipeId)
   .SingleOrDefault();