C# 在筛选器中使用时,NHibernate无法解析一对一映射的属性
好吧,我一定是在做一些非常愚蠢的事情,但我就是看不出那是什么 我有以下疑问:C# 在筛选器中使用时,NHibernate无法解析一对一映射的属性,c#,.net,linq,nhibernate,fluent-nhibernate,C#,.net,Linq,Nhibernate,Fluent Nhibernate,好吧,我一定是在做一些非常愚蠢的事情,但我就是看不出那是什么 我有以下疑问: Recipes recipe = null; var q = session.QueryOver<Recipes>(() => recipe) .Where(p => p.Metadata.SkillCommon) .Where(p => !p.Hidden); 当我运行此查询时,我得到异常: 在中发生类型为“NHibernate.QueryException”的未处理异常
Recipes recipe = null;
var q = session.QueryOver<Recipes>(() => recipe)
.Where(p => p.Metadata.SkillCommon)
.Where(p => !p.Hidden);
当我运行此查询时,我得到异常:
在中发生类型为“NHibernate.QueryException”的未处理异常
NHibernate.dll
其他信息:无法解析属性:Metadata.SkillCommon of:KitchenPC.DB.Models.Recipes
如果删除对元数据的引用
:
var q = session.QueryOver<Recipes>(() => recipe)
//.Where(p => p.Metadata.SkillCommon)
.Where(p => !p.Hidden);
我现在可以运行查询:
var q = session.QueryOver<Recipes>(() => recipe)
.Fetch(prop => prop.Metadata).Eager()
.Where(p => !p.Hidden);
我得到了与上面相同的异常。因此,这个问题与OneTONE映射无关。解决了这个问题,尽管我不确定这是否是最好和/或唯一的方法。看起来它应该能工作,但不幸的是,不行 您需要调用
.JoinAlias
,并针对该实体显式创建一个JOIN
。随后,您可以参考该连接:
Models.RecipeMetadata metadata = null;
var q = session.QueryOver<Recipes>(() => recipe)
.JoinAlias(r => r.Metadata, () => metadata)
.Where(() => metadata.SkillCommon)
.Where(p => !p.Hidden);
Models.RecipeMetadata元数据=null;
var q=session.QueryOver(()=>recipe)
.JoinAlias(r=>r.Metadata,()=>Metadata)
.Where(()=>metadata.SkillCommon)
.其中(p=>!p.Hidden);
这似乎非常有效,可以生成所需的SQL。我有两个问题。第一:如果只使用
查询
,会发生什么?第二:如果您尝试QueryOver(()=>recipe).JoinQueryOver(r=>r.Metadata).Where(r=>r.Metadata.SkillCommon).
,会发生什么?我用.query
进行了一次测试查询,当我运行它时,它发出成千上万的查询。我认为它正在对每个元数据行执行选择
。我可能可以解决这个问题,但是使用.Query
需要我重新编写大量代码。@SimonWhitehead-.JoinQueryOver(r=>r.Metadata)。其中(r=>r.SkillCommon)
甚至不会编译。随后的Where()
调用现在指的是RecipeMetadata
Good point。“我没想到这一点。@SimonWhitehead-是的,在发布我的问题之前,我在JoinQueryOver
上发现了一些其他帖子暗示,但我不知道如何让它起作用。”。。我真的很惊讶这不仅仅是自动工作;它已经在进行连接,并且它拥有所需的数据。干得好!我承认我的QueryOver
知识是缺乏的,因为我们现在基本上只使用Query
。很高兴你解决了!
var q = session.QueryOver<Recipes>(() => recipe)
.Fetch(prop => prop.Metadata).Eager()
.Where(p => !p.Hidden);
.Where(p => p.Metadata.SkillCommon)
Models.RecipeMetadata metadata = null;
var q = session.QueryOver<Recipes>(() => recipe)
.JoinAlias(r => r.Metadata, () => metadata)
.Where(() => metadata.SkillCommon)
.Where(p => !p.Hidden);