Nhibernate使用两个表中的select列进行连接
好的,经过几次尝试,我被困在这一个 我正在使用NHibernate和QueryOver,如下所示。我有一个产品和产品评论Nhibernate使用两个表中的select列进行连接,nhibernate,select,join,queryover,Nhibernate,Select,Join,Queryover,好的,经过几次尝试,我被困在这一个 我正在使用NHibernate和QueryOver,如下所示。我有一个产品和产品评论 public class Product { .... public virtual IList<ProductReview> CustomerReviews {get;set;} .... } public class ProductReview { .... public virtual Product Product {get;set;} ..
public class Product
{
....
public virtual IList<ProductReview> CustomerReviews {get;set;}
....
}
public class ProductReview
{
....
public virtual Product Product {get;set;}
....
}
问题是
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();
产品px=null;
ProductReview rev=null;
var结果=当前会话
.QueryOver()
.Where(r=>r.IsActive&!r.IsDraft)
.选择(
Projections.Property(r=>r.Id).WithAlias(()=>rev.Id),
Projections.Property(r=>r.Title).WithAlias(()=>rev.Title)
)
.OrderBy(r=>r.ReviewDate).Desc()
.TransformUsing(Transformers.AliasToBean())
.JoinAlias(r=>r.Product,()=>px)
.选择(
Projections.Property(()=>px.UPC).带有别名(()=>px.UPC),
Projections.Property(()=>px.FullName).WithAlias(()=>px.FullName)
)
.TransformUsing(Transformers.AliasToBean())
.采取(5)
.List();
错误是:
值“Reviews.Models.Product”不是“Reviews.Models.ProductReview”类型,不能在此泛型集合中使用。参数名称:value
我真的不想再创建一个DTO。我想获得最近5次新评论的列表,并填充其产品(两个实体上只需填写几个必填字段)
在NHibernate 3.0中,这是否可以通过任何方式(原始sql除外)实现?产品px=null;
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();
ProductReview rev=null;
var result=CurrentSession.QueryOver()
.Where(r=>r.IsActive&!r.IsDraft)
.JoinQueryOver(r=>r.Product)
.OrderBy(r=>r.ReviewDate).Desc()
.采取(5)
.List();
我确实提到我不想再上一堂DTO课。但无论如何,谢谢你的回答。更新了我的答案以删除DTO。这就是我现在使用的内容,但它会拉取每个实体的所有字段,这对我来说是一种过分的做法。你需要接受你正在使用ORM的事实。您只要求返回部分数据,这违反了原则。
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();