Соединение Nhibernate с выбранными столбцами из обеих таблиц - PullRequest
0 голосов
/ 12 июля 2011

Хорошо, после нескольких попыток я застрял на этом!

Я использую NHibernate с QueryOver, как показано ниже. У меня есть Product и ProductReview как

public class Product
{
 ....
 public virtual IList<ProductReview> CustomerReviews {get;set;}
 ....
}

public class ProductReview
{
 ....
 public virtual Product Product {get;set;}
 ....
}

Отображение на стороне продукта:

HasMany(x => x.CustomerReviews).KeyColumn("ProductId").Inverse().Cascade.None().LazyLoad();

Запрос

 Product px = null;
 ProductReview rev = null;
var result = CurrentSession
            .QueryOver<ProductReview>()
            .Where(r => r.IsActive && !r.IsDraft)
            .Select(
                Projections.Property<ProductReview>(r => r.Id).WithAlias(() => rev.Id),
                Projections.Property<ProductReview>(r => r.Title).WithAlias(() => rev.Title)
                )
            .OrderBy(r => r.ReviewDate).Desc()
            .TransformUsing(Transformers.AliasToBean<ProductReview>())
            .JoinAlias(r => r.Product, () => px)
            .Select(
               Projections.Property(() => px.UPC).WithAlias(() => px.UPC),
               Projections.Property(() => px.FullName).WithAlias(() => px.FullName)
              )
              .TransformUsing(Transformers.AliasToBean<Product>())
              .Take(5)
              .List();

Ошибка: Значение «Reviews.Models.Product» не относится к типу «Reviews.Models.ProductReview» и не может использоваться в этой универсальной коллекции. Имя параметра: значение

Я действительно не хочу создавать другое DTO. Я хотел бы получить список последних 5 новых обзоров и заполнить его товаром (необходимо заполнить только несколько обязательных полей в обеих сущностях).

Возможно ли это любым способом (кроме raw sql) в NHibernate 3.0?

1 Ответ

1 голос
/ 12 июля 2011
Product px = null;
ProductReview rev = null;

var result = CurrentSession.QueryOver<ProductReview>()
    .Where(r => r.IsActive && !r.IsDraft)
    .JoinQueryOver(r => r.Product)
    .OrderBy(r => r.ReviewDate).Desc()
    .Take(5)
    .List();
...