Отфильтрованные соединения с NHibernate QueryOver - PullRequest
0 голосов
/ 22 ноября 2011

Используя Criteria API, я могу сгенерировать запрос, который создает JOIN с дополнительным условием для JOIN

var criteria = Session.CreateCriteria<Product>()
   .SetReadOnly(true)
   .SetMaxResults(1)
   .CreateAlias("ProductCategory", "U", JoinType.LeftOuterJoin, Expression.Eq("U.SubType", "Premium"))
   .AddOrder(Order.Desc("U.Sequence"));

. Создается JOIN, подобный следующему:

SELECT * FROM dbo.Product w
LEFT JOIN dbo.ProductCategory u
ON u.DefaultProductId = w.Id AND u.SubType = 'Premium'

Как мне сделать то же самое с синтаксисом QueryOver?

Ответы [ 2 ]

0 голосов
/ 26 июня 2016

.JoinAlias ​​имеет перегрузку с withClause

var result = Session.QueryOver<Product>()
    .Left.JoinAlias(x => x.Categories, () => category, c => c.SubType == "Premium")
    .OrderBy(() => category.Sequence).Desc
    .Take(1)
    .List();
0 голосов
/ 22 ноября 2011

С макушки головы я думаю, что это похоже на

ProductCategory category = null;

var result = Session.QueryOver<Product>()
                    .JoinAlias(x => x.Categories, () => category, JoinType.LeftOuterJoin)
                    .Where(() => category.SubType == "Premium")
                    .OrderBy(() => category.Sequence).Desc
                    .Take(1)
                    .List();

Редактировать: включил OrderBy и дал ему тест. Работает.

Используя пример типа Blog> Posts, сгенерированный SQL выглядит так:

SELECT this_.Id           as Id1_1_,
       this_.Title        as Title1_1_,
       post1_.BlogId      as BlogId3_,
       post1_.Id          as Id3_,
       post1_.Id          as Id3_0_,
       post1_.Title       as Title3_0_,
       post1_.Content     as Content3_0_,
       post1_.DatePosted  as DatePosted3_0_,
       post1_.BlogId      as BlogId3_0_
FROM   [Blog] this_
       left outer join [Post] post1_
         on this_.Id = post1_.BlogId
WHERE  post1_.DatePosted > '2011-11-22T19:43:11.00' /* @p0 */
ORDER  BY post1_.DatePosted desc
...