SQL 到带有子查询和分组的 nhibernate 内连接

标签 sql linq nhibernate queryover

如果有人可以帮我将以下 SQL 转换为 nhibernate linq to 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) });           

提前致谢。

最佳答案

好的,

找到了答案,这要归功于安德鲁·惠特克 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));
    }
}

关于SQL 到带有子查询和分组的 nhibernate 内连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34572142/

相关文章:

vb.net - LINQ to Objects - 祖 parent 、 parent 、子女关系

c# - 使用 C# 中的 DataSet 从动态查询中获取数据

c# - NHibernate 中 Session.Merge 方法的用法是什么?

c# - 如何在 Entity Framework 5 Code First 中处理主键

c# - 所有值的计数均为零的频率表

nhibernate - Fluent NHibernate 一对多关系设置外键为空

nhibernate - NHibernate 中的 hilo 错误 - "could not read a hi value - you need to populate the table"

sql - TSQL - 通过引用其他列来填充条目上方和下方的值

MySQL根据子查询区分两种情况

mysql - 如果 'table a' .'column b' 匹配 'table b' .'column b',如何将 'table a' .'column b' 替换为 'table b' .'column a'