Question

Je suis conscient du fait que la même question a été posée et here et il pourrait probablement être un doublon.

Mais la question n'a pas été répondu dans les deux endroits bien à contrecœur, je dois demander à nouveau :(

La question est peut-on utiliser l'API de critères pour joindre deux tables quand il n'y a pas de correspondance disponible entre eux.

par exemple

class Order{ UserId , OrderId} 
 class User{UserId , UserName}

et je dois produire une requête comme,

select user.UserName , order.OrderId from Order order join User user on order.UserId = user.UserId

S'il vous plaît aider si quelqu'un est au courant de this..and s'il vous plaît faire noter que je dois le faire en utilisant des critères techniques ou QueryOver

Merci / BB

Était-ce utile?

La solution

Voici une idée sur la façon dont il peut être fait, mais il est un peu laid.

Depuis la mise en correspondance ne dit pas que la relation entre Commander et utilisateur existe donc il est assez difficile d'avoir NHibernate générer une jointure entre ces deux tables. Ce que vous pouvez faire à la place est faire une sélection interne afin que votre requête comme SQL ressemblerait à ceci:

SELECT o.OrderId, o.WhateverOtherPropertyNameFromOrder
       (SELECT u.UserName, u.WhateverOtherPropertyNameFromUser
        FROM   User u
        WHERE  u.UserId = o.UserId)
FROM   Order o

Cela peut se faire comme ceci sur QueryOver:

Order order = null;
User user = null;

QueryOver<User> query = QueryOver.Of<User>(() => user)
    .Select(Projections.ProjectionList()
               .Add(Projections.Property<User>(x => x.UserName)))
               .Add(Projections.Property<User>(x => x.WhateverOtherPropertyNameFromUser)))
    .Where(Restrictions.EqProperty("user.Id", "order.UserId"));

var result = session.QueryOver<Order>(() => order)
    .Select(Projections.ProjectionList()
            .Add(Projections.Property<Order>(c => c.OrderId))
            .Add(Projections.Property<Order>(c => c.WhateverOtherPropertyNameFromOrder))
            .Add(Projections.SubQuery(query)))
    .List<object[]>();

Je ne sais pas si cela est utile du tout pour vous, mais il est une solution possible à votre problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top