流利的Nhibernate内部联接

我有3张桌子(Master,Imagen,Linea):

Master
public virtual int Id { get; private set; }
public virtual Imagen imagen { get; set; }

Imagen
public virtual int Id { get; private set; }
public virtual Linea linea { get; set; }

Linea
public virtual int Id { get; private set; }
public virtual String Nombre { get; set; }

我需要这样的查询:

SELECT * FROM dbo.Master 
INNER JOIN dbo.Imagen ON dbo.Master.imagen_id = dbo.Imagen.Id 
INNER JOIN dbo.Linea ON dbo.Imagen.linea_id = dbo.Linea.Id 
WHERE dbo.Linea_Id = 5

但我不知道如何告诉Fluent Nhibernate使用automapper创建此查询。 到目前为止,我试过这个:

ICriteria c = session.CreateCriteria(typeof(Master))
  .CreateAlias("dbo.Imagen", "img", JoinType.InnerJoin)
  .Add(Restrictions.Eq("img.linea_id", id_linea));

return c.List();

但我得到这个错误: 无法解析属性:dbo:ImageManager.Model.Entity.Master

关于如何进行内部加入的任何想法? 提前致谢

3

2 答案

首先,我将从dbo.Imagen中删除dbo。使用ICriteria接口,您需要考虑对象而不是数据库表,即使可能存在对象到表和属性到列的一对一映射。

EDIT:
another option would be to use the QueryOver Lambda syntax.

   var list = session.QueryOver()
                        .JoinQueryOver(master => master.imagen)
                        .Where(imagen => imagen.linea.Id == 5)
                        .List();
8
额外
很抱歉......我自己也在学习QueryOver语法。会解决。
额外 作者 Nathan Fisher,
固定。我测试了这个。它现在应该工作。
额外 作者 Nathan Fisher,
谢谢,Alredy这样做了。我是Fluent Nhibernate的新手。
额外 作者 lloiacono,
我试过这个但是我得到了这个错误:“无法解析属性:imagen.linea.Id:ImageManager.Model.Entity.Master”我也改为.Where(Master => Master.imagen.linea.Id == 5 )但我得到同样的错误
额外 作者 lloiacono,
它很有效!!!,非常感谢。无论如何,我最终使用ICriteria,因为我需要获取与该master相关的图像和线条,这就是为什么我为imagen和hdd添加了createalias,如果我没有这样做,当我尝试访问图像或hdd属性时,我得到一个LazyLoadException我的主对象。
额外 作者 lloiacono,
这里是代码:ICriteria c = session.CreateCriteria(typeof(MasterHdd))。CreateAlias(“imagen”,“img”,JoinType.InnerJoin).CreateAlias(“hdd”,“h”,JoinType.InnerJoin).CreateAlias( “img.linea”,“lin”,JoinType.InnerJoin).Add(Restrictions.Eq(“lin.Id”,id_linea)); return c.List ();
额外 作者 lloiacono,

如果您已经修复过,我无法解决您以前的评论,但我会尝试

ICriteria c = session.CreateCriteria(typeof(Master))

.CreateAlias("imagen", "img", JoinType.InnerJoin)
.CreateAlias("img.linea", "lin", JoinType.InnerJoin)
.Add(Restrictions.Eq("lin.Id", 5));

return c.List();

编辑:套管如下所述改变。

3
额外
您收到的错误消息是什么?
额外 作者 fluent,
好点。套管在我的回答中改变了。
额外 作者 fluent,
我认为这个答案的唯一问题是对象引用的情况。你有Imagen,其中@lloiacono的对象引用都是小写的 - imagen。 Linea参考将是相同的。这可能是它无法正常工作的原因。
额外 作者 Nathan Fisher,
看看stephen bohlen的nhibernate系列的夏天,现在已经有几年了,但一般来说ICriteria和nhibernate都有基础知识。另请参阅 funnelweblog.com 这是一个基于流利的nhibernate的开源博客平台
额外 作者 Nathan Fisher,
非常感谢,我正在努力解决这个问题。问题是不起作用。这是我得到的错误:“无法解析属性:Imagen of:ImageManager.Model.Entity.Master”我使用自动映射来映射模型文件夹下的所有内容:.Mappings(m => m.AutoMappings.Add(model)))在模型文件夹中我有一个名为Entity的子文件夹,我有实体:
额外 作者 lloiacono,
public class Master {public virtual int Id {get;私人集; public virtual Imagen imagen {get;组; } public virtual Hdd hdd {get;组; public virtual String hash_master {get;组; }}
额外 作者 lloiacono,
公共类Linea {public virtual int Id {get;私人集; public virtual int ObjVersion {get;组; public virtual String Nombre {get;组; public virtual String Tabla {get;组; public virtual String NombreCorto {get;组; public class Imagen {public virtual int Id {get;私人集; public virtual String PartNumber {get;组;公共虚拟字符串版本{get;组;公共虚拟字符串所以{get;组; public virtual String Revision {get;组;公共虚拟Linea linea {get;组; public virtual String Nombre {get;组; }}
额外 作者 lloiacono,
谢谢@NathanFisher确实是个问题。我不再得到错误了,你能推荐我一本流利的好手册,我读维基但我找不到关于Icriteria的任何信息。
额外 作者 lloiacono,