我有这个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();
原始查询。
答案 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
中使用它。