【问题标题】:Trouble translating SQL query to LINQ with join and having count使用连接和计数将 SQL 查询转换为 LINQ 时遇到问题
【发布时间】:2017-02-09 08:47:56
【问题描述】:

我有这个需要转换为 LINQ 的 SQL 查询。

SELECT p.productId, p.name, COUNT(np.ID) AS 'salesLast70', p.quantity
FROM Products p
LEFT JOIN NOrderProducts np
ON np.product_id = p.productId
WHERE np.date_picked > DATEADD(DAY, -70, getdate())
GROUP BY p.productId, p.name, p.quantity
HAVING COUNT(np.ID) < p.quantity

现在我有以下 LINQ 查询。

var date70 = DateTime.Now.AddDays(-70).Date;
var almostOutOfStockProducts = from p in db.Products
    join np in db.NOrderProducts on p.productId equals np.product_id
    where np.date_picked > date70
    group np by np.ID into npGrp
    where npGrp.Count() < p.quantity
    select p;

p 无法在&gt; p.quantityselect p 的LINQ 查询末尾解析。

我确定我在我的 LINQ 查询中遗漏了一些东西,但我似乎无法找到确切的解决方法。

编辑:

我最终在原始查询中使用了db.Database.SqlQuery();

【问题讨论】:

    标签: c# sql asp.net linq


    【解决方案1】:

    要达到您想要的效果,您必须提升数量,从产品名称到分组依据。您在您的 sql 版本中使用子句 GROUP BY p.productId, p.name, p.quantity 执行此操作,但您没有在您的 linq 版本中执行此操作。

    一个例子是:

    var almostOutOfStockProducts = db.Products.Join(db.NOrderProducts, p => p.productId, np => np.product_id, (p, np) => new { p, np })
                                .Where(x => x.np.date_picked > date70)
                                .GroupBy(x => new { Quantity = x.p.quantity, Name = x.p.name, ProductId = x.p.productId})
                                .Where(x => x.Count() < x.Key.Quantity)
                                .Select(x => new {ProductId = x.Key.ProductId, Quantity = x.Key.Quantity, Name = x.Key.Name});
    

    GroupBy 中,我将产品中的产品ID、数量和名称转换为匿名类型。然后这成为关键,因此我可以在 Where 子句中使用它,也可以在最后的 Select 中使用它。

    【讨论】:

    • 虽然这确实解决了我面临的问题,但由于其他原因,我最终还是使用了db.Database.SqlQuery();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 2015-05-11
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    相关资源
    最近更新 更多