nHibernate объединяет запрос - PullRequest
       0

nHibernate объединяет запрос

0 голосов
/ 22 февраля 2011

У меня есть две таблицы (представление графика - одна таблица - это узлы, другая - это связь между узлами), и я хочу написать этот запрос в nHibernate:

SELECT 
  distinct(t.id),  t.NodeName, e.Fk_linkOne, e.Fk_linkTwo, e.RelationName
FROM Nodes t
INNER JOIN NodeRelation e ON t.Id=e.Fk_linkOne OR t.Id=e.Fk_linkTwo
where (e.Fk_linkOne =84 OR e.Fk_linkTwo=84 ) AND t.Id!=84

Я не нашел, как соединить дветаблицы с объединением, которые имеют ИЛИ в нем ..

ICriteria criteriaSelect = Session
  .CreateCriteria(typeof(NodeRelation ), "nodeRelations")                  
  .CreateCriteria("nodeRelations.Node", "node",
       NHibernate.SqlCommand.JoinType.InnerJoin)

Ответы [ 3 ]

0 голосов
/ 22 февраля 2011

Вы должны использовать DetachedCriteria, чтобы сделать то же самое. Я не уверен в вашем запросе, но я просто сделаю попытку.

var dc1= DetachedCriteria.For(typeof( NodeRelation )).Add(Restrictions.Eq("Fk_linkOne", 84))
.SetProjection(Projections.Property("Fk_linkOne"));

var dc2= DetachedCriteria.For(typeof( NodeRelation )).Add(Restrictions.Eq("Fk_linkTwo", 84))
.SetProjection(Projections.Property("Fk_linkTwo"));

Session.CreateCriteria(typeof(Nodes))
.Add(Subqueries.PropertyIn("Id", dc1))
.Add(Subqueries.PropertyIn("Id", dc2))
.Add(Restrictions.Eq("Id", 84)).List<Nodes>;

Надеюсь, что приведенный выше запрос корректен. пожалуйста, дайте мне знать, если вы не можете заставить его работать после того, как он попробует что-нибудь, и дайте мне знать, когда вы попробовали.

0 голосов
/ 23 февраля 2011

Это всегда зависит от ваших занятий, а не от ваших столов. Помните, что вы используете ORM и работаете с моделью класса.

Предполагается, что ваши занятия выглядят так:

class Node
{
  List<Node> Relations { get; private set; }
  List<Node> InverseRelations { get; private set; }
}

Вы можете отобразить это так:

<class name="Node">
<!-- .... -->
  <bag name="Relations" table="NodeRelation">
    <key name="Fk_linkOne">
    <many-to-many class="Node" column="Fk_linkTwo"/>
  </bag>
  <bag name="InverseRelations" table="NodeRelation" inverse="true">
    <key name="Fk_linkTwo">
    <many-to-many class="Node" column="Fk_linkOne"/>
  </bag>

</class>

Таким образом, вы получаете асимметричные отношения (это означает: когда Узел A связан с Узлом B, B не обязательно связан с A, за исключением, конечно, InverseRelation). Я не знаю, что вам действительно нужно, так что это предположение, основанное на дизайне вашей базы данных.

Ваш запрос может выглядеть так:

from Node n
where 
  :x in elements(n.Relations)
  or :x in elements(n.InverseRelations)

Примечание: x - это тип сущности, а не просто идентификатор (вам нужно загрузить его, используя session.Load<Node>(84)),

Другой способ для сами запроса:

select distinct n
from Node n 
  inner join n.Relations e1 
  inner join n.InverseRelations e2
where e1.id = 84 or e2.id = 84

Или другим способом без использования обратных соотношений:

select n
from Node n, Node n2 inner join n.Relations e
where
  (n = n2 and e.id = 84)
  OR (n = e and n2.id = 84)

В критериях я бы взял второе решение и напишите его так:

session.CreateCriteria<Node>("n")
  .SetProjection(Projections.Distinct("n"))
  .CreateCriteria("Relations", "e1")
  .CreateCriteria("InverseRelations", "e2")
  .Add(Expression.Or(
    Expression.Eq("e1.id", 84),
    Expression.Eq("e2.id", 84));
0 голосов
/ 22 февраля 2011

Вы можете определять свои объединения только в соответствии с ассоциациями, которые вы определили в своих сопоставлениях. Насколько я знаю, вы не можете определить отношения стиля OR в Nhibernate. Рассмотрите возможность использования самореферентного представления графа стилей.

public class Node
{
    public IList<Node> Parents { get; set; }
    public IList<Node> Children { get; set; }
}

<bag name="Parents" table="Node_Relation">
   <key column="ChildId" />
   <many-to-many class="Node" column="ParentId" />
</bag>
<bag name="Children" table="Node_Relation">
   <key column="ParentId" />
   <many-to-many class="Node" column="ChildId" />
</bag>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...