使用子查询和分组的Nhibernate内部联接的SQL

杰森·鲍尔斯(Jason Bowers)

如果有人可以帮助我将以下SQL转换为NHLibernate linq并转换为QueryOver API,我将不胜感激。

SELECT p.ManufacturerName as Name, sum(ps.QtyAvail) as QuantityAvailable 
from Product p
inner join (select ProductId, QtyAvail 
from ProductStats ps
where ps.QtyAvail > 0) ps on p.ProductId = ps.ProductId
where ltrim(rtrim(isnull(p.ManufacturerName, ''))) <> ''
group by p.ManufacturerName
order by Name

到目前为止,这是我唯一可以编译和运行的东西。

        var o = Session
            .Query<Product>()
            .Where(p => p.ManufacturerName != null && p.ManufacturerName.Trim() != string.Empty)
            .Join(Session.Query<ProductStats>().Where(ps => ps.QtyAvail > 0), product => product.ProductId, stats => stats.ProductStatId,
                (product, stats) => new { Name = product.ManufacturerName, QuantityAvailable = stats.QtyAvail })
            .GroupBy(q => q.Name)
            .Select(g => new { Name = g.Key, QuantityAvailable = g.Sum(v => v.QuantityAvailable) });           

提前致谢。

杰森·鲍尔斯(Jason Bowers)

好的,

通过安德鲁·惠特克(Andrew Whitaker)的大量贡献找出了答案,网址为http://blog.andrewawhitaker.com/queryover-series/

    [TestMethod]
    public void CanGetManufacturersWithOnHandQuantities()
    {
        ProductStats statsAlias = null;
        ManufacturersInStock manufacturersInStock = null;

        var o = Session
            .QueryOver<Product>()
            .OrderBy(p => p.ManufacturerName).Asc
            .WhereStringIsNotNullOrEmpty(p => p.ManufacturerName)
            .JoinQueryOver(p => p.Stats, () => statsAlias)
            .Where(ps => ps.QtyAvail > 0)
            .SelectList(l => l.SelectGroup(p => p.ManufacturerName).WithAlias(() => manufacturersInStock.Name)
                              .SelectSum(() => statsAlias.QtyAvail).WithAlias(() => manufacturersInStock.InStockCount))
            .TransformUsing(Transformers.AliasToBean<ManufacturersInStock>());


        var results = o.List<ManufacturersInStock>();
        Assert.IsTrue(o.RowCount() > 0);
    }

public class ManufacturersInStock
{
    public string Name { get; set; }

    public int InStockCount { get; set; }
}

public static class QueriesExtentions
{
    public static IQueryOver<E, F> WhereStringIsNotNullOrEmpty<E, F>(this IQueryOver<E, F> query, Expression<Func<E, object>> propExpression)
    {
        var prop = Projections.Property(propExpression);
        var criteria = Restrictions.Or(Restrictions.IsNull(prop), Restrictions.Eq(Projections.SqlFunction("trim", NHibernateUtil.String, prop), ""));
        return query.Where(Restrictions.Not(criteria));
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用内部联接和子查询的mysql查询

来自分类Dev

使用子查询和内部联接插入

来自分类Dev

使用联接,分组依据和聚合函数的SQL选择查询

来自分类Dev

使用多个联接和分组优化SQL查询(Postgres 9.3)

来自分类Dev

更换内部联接与SQL子查询

来自分类Dev

具有内部联接的SQL子查询

来自分类Dev

优化SQL分组依据和联接查询

来自分类Dev

优化SQL分组依据和联接查询

来自分类Dev

SQL子查询和联接查询

来自分类Dev

添加内部联接和分组依据时的SQL查询时差给出错误的计算

来自分类Dev

Mysql:左联接和内部联接在子查询中

来自分类Dev

使用NHibernate Linq查询无法建立内部联接

来自分类Dev

使用NHibernate Linq查询无法建立内部联接

来自分类Dev

SQL查询-Count()和内部联接

来自分类Dev

使用内部联接和子查询后,MYSQL查询速度变慢

来自分类Dev

按月对 ID 重叠(通过内部联接)进行分组的 SQL 查询

来自分类Dev

多个内部联接和子查询的查询优化

来自分类Dev

SQL Select子查询和联接

来自分类Dev

SQL SERVER:左联接和子查询

来自分类Dev

SQL SERVER:左联接和子查询

来自分类Dev

SQL子查询和表联接问题

来自分类Dev

SQL查询中不使用内部联接

来自分类Dev

SQL在左联接中使用内部查询

来自分类Dev

使用内部联接的SQL查询Distict计数

来自分类Dev

具有总和,联接和分组依据的Mysql子查询

来自分类Dev

postgresql分组和内部联接

来自分类Dev

SQL内部联接与分组依据

来自分类Dev

联接和子查询

来自分类Dev

ActiveRecord子查询内部联接