我想在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
)"
);
然而,这仅返回我所在的同一节点。我也可以删除子查询,得到相同的结果。
我做错了什么?
答案 0 :(得分:1)
检查此概述(文档的后半部分)如何进行集合映射:
我想说,有一些误解。
首先,.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(....