使用 QueryOver 与 NHibernate 进行内部连接的 SQL 查询
Posted
技术标签:
【中文标题】使用 QueryOver 与 NHibernate 进行内部连接的 SQL 查询【英文标题】:SQL query with inner join to NHibernate with QueryOver 【发布时间】:2012-07-18 21:19:32 【问题描述】:我有这个 SQL 查询:
select pr.*, det.Description, det.Name
from Product pr
inner join ProductDetail det on det.Product_id = pr.id
where pr.Id = XX and det.IsDefault = yy
如何使用 QueryOver 做到这一点?
谢谢,
更新:
public ProductMap()
Id(x => x.Id).GeneratedBy.Native();
Map(x => x.Code)
.Length(20)
.Not.Nullable();
Map(x => x.CreationDate).Not.Nullable();
Map(x => x.IsDeleted);
Map(x => x.Price);
HasManyToMany(x => x.Categories)
.AsSet()
.Cascade
.SaveUpdate()
.Table("ProductsCategories");
public class ProductDetailMap : ClassMap<ProductDetail>
public ProductDetailMap()
Id(x => x.Id).GeneratedBy.Native();
Map(x => x.Name)
.Length(50)
.Not.Nullable();
Map(x => x.Description)
.Length(250);
Map(x => x.IsDefault);
References(x => x.Language);
References(x => x.Product);
【问题讨论】:
你想摆脱什么类型的? @AndrewWhitaker 匿名类型。 【参考方案1】:据我所知,QueryOver 没有相当于“pr.*”的部分,这很好。 这意味着您必须在查询中手动指定 pr 的每个属性。
参见文档here上的“预测”部分
但它会是这样的:
Product productAlias = null;
ProductDetail productDetail = null;
var query = session.QueryOver(() => productAlias)
.Inner.JoinAlias(() => productAlias.ProductDetails, () => productDetail)
.Where(() => productAlias.Id == XX && productDetail.IsDefault == YY)
.SelectList(list => list
.Select(() => productAlias.Id)
.Select(() => productAlias.Property1)
.Select(() => productAlias.Property2)
// and so on...
.Select(() => productDetail.Description)
.Select(() => productDetail.Name)
);
// One way of doing it...
// Will give you a list of object arrays matching the result
var results1 = query.List<object[]>();
// Another way...
// You need to define a class that has all the properties your are querying for
// If we create a class like that called "MySummaryClass" you can do:
var results2 = query.TransformUsing(Transformers.AliasToBean<MySummaryClass>()).List<MySummaryClass>();
【讨论】:
好吧,做两个查询然后使用 linq 合并两个查询会更容易,这样可以正常工作以上是关于使用 QueryOver 与 NHibernate 进行内部连接的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
使用 NHibernate 3.0 QueryOver 或 LINQ 提供程序的权衡
NHibernate QueryOver 与 SelectList
NHibernate QueryOver 与 Fetch 产生多个 sql 查询和数据库命中
如何使用 NHibernate QueryOver 重新创建这个复杂的 SQL 查询?