2016-04-13 13 views
1

私はそれらに関連する1つの外部キーを持つ2つのテーブル(ノードと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と呼ばれる別のエンティティを作成しました結果を保持する。

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

私はこの例外で終わる:私のC#コードは次のようになります {「不明な列 『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()'は、Libernateではなく_queryover_、Hibernate固有のAPIです。 LINQを使いたい場合は、 'session.Query ()'で始まります。 –

+0

また、FluentNHibernateはマッピングを定義するためのAPIに過ぎず、クエリーを実行するときには後で関与しません。あなたが本当に求めているのは、 "NHibernateでXをクエリする方法"です。以下のコールの回答は良いもののようです。 –

答えて

1

正直私は、QueryOverではなくLinqプロバイダを使用します。あなたがやった場合、それは次のようになります。これはDTO /モデルのように見えるようNodeDetailsViewをマッピングする必要はありません

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

。データベース表またはビューを表すオブジェクトのみをマップします。

上記から、SizeInFeetが目的と異なることが明らかである。 1つはstringで、もう1つはintです。これが実際の場合は、クエリ内で何かの変換を行う必要があります。SizeInFeet = x.SizeInFeet.ToString()

関連する問題