使用 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 查询?

NHibernate 3.0:没有使用QueryOver的FirstOrDefault()?

NHibernate 使用 QueryOver 和 Future 加入两个集合