无法通过连接和计数将SQL查询转换为LINQ

时间:2017-02-09 08:47:56

标签: c# sql asp.net linq

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

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> p.quantity的LINQ查询结束时无法解析select p

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

编辑:

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

1 个答案:

答案 0 :(得分:0)

要实现您想要的功能,您必须提升数量,从产品命名为组。你是在你的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中使用它。