2016-04-13 59 views
1

我想弄清楚如何連接兩個表(節點和NodeDetails)有一個外鍵相關他們。基本上,我在尋找這個sql查詢的NHibernate的LINQ版本:如何做一個簡單的表連接流利Nhibernate 4

SELECT node.ObjectType, nodeDetails.Name, nodeDetails.SizeInFeet 
FROM node 
left join nodeDetails 
on node.ID = nodedetails.nodeID 
ORDER BY node.ObjectType; 

因爲我在做一個連接,我並不需要所有的欄目,我創建了一個名爲NodeDetailsView另一個實體是假設保持結果。我的C#代碼如下所示:

Node n = null; 
NodeDetails nd = null; 

var q = _session.QueryOver<NodeDetails>(() => nd) 
    .JoinQueryOver(x => x.NodeID,() => n) 
    .TransformUsing(Transformers.AliasToBean<NodeDetailsView>()); 

IList<NodeDetailsView> r = t.List<NodeDetailsView>(); 

我結束了與此異常: {「在‘字段列表’未知列‘this_.SizeInFeet’」}我不認爲我的LINQ查詢以上是正確的,我映射可能不正確。你們可以看看它並給我幾個指針嗎?謝謝!

我的實體類: Node.cs

public class Node 
{ 
    public virtual int ID { get; set; } 
    public virtual string ObjectType { get; set; } 
    public virtual string Location {get; set;} 
} 

Nodetail.cs

public class NodeDetails : IVersionedEntity 
{ 
    public virtual int ID { get; set; } 
    public virtual Node NodeID { get; set; } 
    public virtual int SizeInFeet { get; set; } 
    public virtual float Price { get; set; } 
} 

視圖類NodeDetailsView.cs

public class NodeDetailsView 
{ 
    public virtual string ObjectType { get; set; } 
    public virtual string SizeInFeet { get; set; } 
    public virtual int TotalSpace { get; set; } 
} 

流利的映射

public class NodeMap: ClassMap<Node> 
{ 
    public WorldObjectMap() 
    { 
     Id(x => x.ID); 
     Map(x => x.ObjectType).Not.Nullable(); 
     Map(x => x.Location).Not.Nullable(); 
    } 
} 

public class NodDetailsMap : ClassMap<NodeDetails> 
{ 
    public NodDetailsMap() 
    { 
     Id(x => x.ID); 
     References(x => x.NodeID).Column("ID"); 
     Map(x => x.MarketPrice).Nullable(); 
     Map(x => x.SizeInFeet).Nullable(); 
    } 
} 

public class NodeDetailsViewMapping : ClassMap<NodeDetailsView> 
{ 
    public WorldObjectLeasesViewMapping() 
    { 
     Map(x => x.ObjectType).Not.Nullable(); 
     Map(x => x.Name).Nullable(); 
     Map(x => x.SizeInFeet); 
    } 
} 
+0

QueryOver()是_queryover_,它是一個NHibernate特定的API,而不是LINQ。如果您想使用LINQ,請從'session.Query ()'開始。 –

+0

另請注意,FluentNHibernate只是一個定義映射的API,它在查詢後不再涉及。你真正要問的是「如何在NHibernate中查詢X?」。科爾的迴應似乎是一個很好的迴應。 –

回答

1

老實說,我會使用Linq提供程序而不是QueryOver。如果你沒有它會是這個樣子:

using NHibernate.Linq 

IList<NodeDetailsView> r = _session.Query<NodeDetails>() 
       .Select(x => new NodeDetailsView 
         { 
          ObjectType = x.NodeID.ObjectType, 
          SizeInFeet = x.SizeInFeet, 
          TotalSpace = "not sure what this is..." 
         } 
       .ToList() 

沒有必要映射NodeDetailsView,因爲這似乎是一個DTO /型號。您只映射代表數據庫表或視圖的對象。

從上面也可以看出,SizeInFeet因對象而異。一個是string,另一個是int。如果確實如此,則必須在查詢中進行轉換,類似SizeInFeet = x.SizeInFeet.ToString()

相關問題