Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在筛选器中使用时,NHibernate无法解析一对一映射的属性_C#_.net_Linq_Nhibernate_Fluent Nhibernate - Fatal编程技术网

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);