Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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# 如何在fluent Nhibernate 4中进行简单的表联接_C#_Linq_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# 如何在fluent Nhibernate 4中进行简单的表联接

C# 如何在fluent Nhibernate 4中进行简单的表联接,c#,linq,nhibernate,fluent-nhibernate,C#,Linq,Nhibernate,Fluent Nhibernate,我试图找出如何连接两个表Node和NodeDetails,它们有一个外键将它们关联起来。基本上,我正在寻找这个sql查询的nhibernate linq版本: SELECT node.ObjectType, nodeDetails.Name, nodeDetails.SizeInFeet FROM node left join nodeDetails on node.ID = nodedetails.nodeID ORDER BY node.ObjectType; 因为我正在进行连接,并且不需

我试图找出如何连接两个表Node和NodeDetails,它们有一个外键将它们关联起来。基本上,我正在寻找这个sql查询的nhibernate linq版本:

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

老实说,我会使用Linq提供程序而不是QueryOver。如果你这样做了,它会像这样:

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>();
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因对象而异。一个是字符串,另一个是int。如果确实是这种情况,您必须在查询中使用类似于SizeInFeet=x.SizeInFeet的内容进行转换。ToString

QueryOver是QueryOver,一种特定于NHibernate的API,而不是LINQ。如果要使用LINQ,请从session.Query开始。还要注意,FluentNHibernate只是一个定义映射的API,稍后在执行查询时不涉及它。你真正想问的是如何在NHibernate?中查询X?。科尔下面的回答似乎很好。