NHibernate公式 - 映射实体列表

时间:2015-03-12 21:18:22

标签: c# nhibernate nhibernate-mapping linq-to-nhibernate fluent-nhibernate-mapping

我想在Fluent NHibernate中创建一个公式,它有一个Subquery,可以获取结果列表。

我有一个名为node_cable的表,其中包含以下列: | ID |节点|电缆|

节点列描述了节点,而有线描述了这些节点之间的连接。

示例:

  

| ID |节点|电缆|

     

| 1 | 2000 | 100 |

     

| 2 | 2001 | 100 |

这意味着电缆100连接节点2000和2001。

以下查询为我提供了所需的结果:

SELECT * 
FROM node_cable as AA
WHERE AA.node != 3565
AND AA.cable IN
(
    SELECT * FROM
    (
        SELECT BB.cable
        FROM node_cable as BB
        WHERE BB.node = 3565
    ) AS subquery
)

我如何在Fluent NHibernate中写这个?香港专业教育学院尝试使用Map.Formula,但没有运气:

Map(x => x.siblings).Formula(@"SELECT AA.node
                        FROM node_cable as AA
                        WHERE AA.node != 3565
                        AND AA.cable IN
                        (
                            SELECT * FROM
                            (
                                SELECT BB.cable
                                FROM node_cable as BB
                                WHERE BB.node = 3565
                            ) AS subquery
                        )");

兄弟姐妹的定义是:

public virtual IList<NodeEntity> siblings { get; set; }

我得到的错误是:

  

{“无法确定类型:System.Collections.Generic.IList`1 [[GOTHAM.Model.NodeEntity,GOTHAM-MODEL,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]],mscorlib,版本= 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c5619340089,用于列:NHibernate.Mapping.Formula(SELECT AA.node \ r \ n FROM node_cable as AA \ r \ n WHERE AA.node!= 3565 \ r \ n AND AA.cable IN \ r \ n(\ r \ n SELECT * FROM \ r \ n \ n(\ r \ n \ n \ n \ n \ n \ n \ n \ n选择BB.cable \ r \ n来自node_cable为BB \ r \ n WHERE BB.node = 3565 \ r \ n \ n)AS子查询\ r \ n))“}

任何人都有任何想法?

编辑: 查询结果图片: http://gyazo.com/0d3152314631500ece81e6c0b2efe3d5

谢谢!

编辑:

现在我有以下映射到兄弟姐妹:

      HasMany(x => x.siblings)
    .Not.LazyLoad() 
    .AsBag()
    .Fetch.Join()
    .Inverse()
    .Table("node_cable")
    .KeyColumn("id")
    .Subselect(
    @"SELECT
    id AS P1,
    node AS P2,
    cable AS P3 
    FROM node_cable as AA
    WHERE AA.node != 3565
    AND AA.cable IN
    (
        SELECT * FROM
        (
            SELECT BB.cable
            FROM node_cable as BB
            WHERE BB.node = 3565
        ) AS subquery
    )"
  );

然而,这仅返回我所在的同一节点。我也可以删除子查询,得到相同的结果。

Reference

我做错了什么?

1 个答案:

答案 0 :(得分:1)

检查此概述(文档的后半部分)如何进行集合映射:

Mapping-by-Code - Set and Bag

我想说,有一些误解。

首先,.Formula()替换标准.Column()。背后的想法是,我们可以计算一些值(rate * amount)......它不能用于集合映射。这里只是返回列

其次我们尝试映射集合:

public virtual IList<NodeEntity> siblings { get; set; }

映射.Map()仅适用于值类型。因此,如果tehre是配对表,我们需要不同的映射.HasMany()甚至.HasManyToMany()

// this way we mapp collections
HasMany(x => x.siblings)
   ...

而且,我不确定内部选择,子查询。通常我们映射实体,然后对于HasMany,表由实体映射定义。

如果关系是一对多,我们需要我们的集合项NodeEntity被映射&#34;标准方式&#34; - 用作参考。

如果我们需要特别选择......我们可以使用不同的方法:

7.2. Collections of dependent objects

<set name="SomeNames" table="some_names" lazy="true">
    <key column="id"/>
    <composite-element class="Eg.Name, Eg"> <!-- class attribute required -->
        <property name="Initial"/>
        <property name="First"/>
        <property name="Last"/>
    </composite-element>
</set>

在这种情况下,我们将元素(例如NodeEntity)属性按属性映射到某些select,在上面的示例table="some_names"中。但是NHibernate更进一步......

我们可以用内联选择替换表格(我们回到问题中提到的公式)

强大的设置是: <subselect>

<set name="siblings" lazy="true">

    <subselect>
    SELECT AA.node
    property1 AS P1,
    property2 AS P2,
    property3 AS P3,
    FROM node_cable as AA
    WHERE AA.node != 3565
    AND AA.cable IN
    (
        SELECT * FROM
        (
            SELECT BB.cable
            FROM node_cable as BB
            WHERE BB.node = 3565
        ) AS subquery
    )
    </subselect>

    <key column="node"/>
    <composite-element class="NodeEntity">
        ...
    </composite-element>
</set>

很好,所有人都可以转换成流利的:

HasMany(x => x.siblings)
    .Subselect(....