【发布时间】:2016-01-22 02:37:11
【问题描述】:
我有一个想要转换为 LINQ 查询的 SQL 查询,但我不知道如何继续。我有两个实体Product 和Price。 Price 通过ProductId 链接到Product。该查询根据请求的Product 的数量获取产品的最优价格。
例如:如果客户想要购买 10 件产品,则该产品的价格可能为 5 美元/件。但是,如果客户想要购买 100 件产品,那么成本可能是 3 美元/件。此查询将根据请求的数量获得最佳单价。 WHERE 子句确保选择了正确的产品,如果日期已过,则不包括任何价格。 CASE 语句对价格进行排序,只要达到请求的数量,就会首先显示最优惠的价格。
Price Table
--------------------------
Id ProductId Quantity Price BeginDate EndDate
=========================================================================
1 1234 10 $5 1/1/2016 2/1/2016
2 1234 100 $3 1/1/2016 2/1/2016
3 1234 100 $1 1/1/2016 1/9/2016
4 1234 500 $2 1/1/2016 2/1/2016
SELECT TOP 1
Product.Id,
Product.Name,
Prices.Price
FROM Products INNER JOIN Prices ON Products.Id = Prices.ProductId
WHERE Product.Id = @ProductId
AND ((Price.BeginDate IS NULL OR Price.BeginDate < GETDATE()) AND (Price.EndDate IS NULL OR Price.EndDate > GETDATE()))
ORDER BY
CASE WHEN Price.Quantity <= @RequestedQuantity THEN Price.Quantity
ELSE -Price.Quantity
END
在 LINQ 中让我感到困惑的查询部分 ..
- 如何过滤出价格日期已过期的价格(例如 Id = 3)。
- 如何使用 case 语句对集合进行排序。
一旦这些都到位,我就可以使用FirstOrDefault 选择最佳结果
【问题讨论】:
-
你在使用实体框架吗?我忘了问。
-
这可能是一个愚蠢的问题,但是...通过将查询转换为 LINQ 可以得到什么?从查询 SQL 数据源的情况来看,它已经在 SQL 中工作了。将它放入 LINQ 会迫使您执行当前卡住的翻译,并让系统重新计算您已有的 SQL。
-
@eftpotrm - 这根本不是一个愚蠢的问题。你是对的,我确实把它作为一个存储过程工作,我可以从实体框架中执行它。事实上,我认为使用存储过程是获取正确记录的最佳方式。如果需要,我对如何通过 LINQ 编写查询感到困惑。
-
@Blue Eyed Behemoth - 对不起,我应该提到这一点。是的,我正在使用实体框架 v6。
-
@webworm 我更新了我的答案,现在应该更有意义(如果您不在.Net 4.6 上,请检查
null而不是使用?)。另外,我了解您的结构,哈哈