【问题标题】:SQL to nhibernate inner join with sub query and groupingSQL 通过子查询和分组来休眠内部连接
【发布时间】:2016-04-06 22:38:52
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 您是否尝试过使用 QueryOver API?如果您尝试,我们会帮助您,但如果您付出很少的努力,我们就不太可能提供帮助。
  • 是的,我试过的都没有用
  • 发布您尝试过的内容,以便我们看到您的错误。我们需要查看您的代码以提供帮助。
  • 你不能使用 QueryOver 加入任意的selects,只能加入映射表。您必须使用 HQL 或原始 SQL。

标签: sql linq nhibernate queryover


【解决方案1】:

好的,

找到答案,感谢 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));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多