【问题标题】:Convert SQL to Linq Lambda将 SQL 转换为 Linq Lambda
【发布时间】:2016-08-09 10:08:01
【问题描述】:

我有两个名为 Purchases 和 Packets 的实体 (EF 6)。我可以加入这两个,但不太确定如何计算给定购买中包含的数据包。我将此 SQL 查询转换为 LINQ(首选 Lambda 表达式)。

谢谢

SELECT 
    Pur.*, 
    Pac.Price, 
    (SELECT COUNT(ID) FROM Packets WHERE PurchaseID = Pur.ID) AS PacketCount
FROM 
    Purchases AS Pur
INNER JOIN 
    Packets AS Pac 
ON 
    Pur.ID = Pac.PurchaseID

注意:我检查了已回答的问题,但没有一个问题能解决我的问题。

【问题讨论】:

  • 如果你能包含两个类对象之间的关系将会很有帮助。它是双向导航属性吗?
  • 错误的问题。如果实体Purchage 通过Packages 关系与实体Package 相关,则只需编写myPurcahe.Packages.Count()。如果您发现自己在实体之间编写连接,则您的域模型可能是错误的
  • 这就是我的想法@Panagiotis,我觉得看看这些对象会有所帮助。
  • 没有“双向关系”......但是,表 Packages 包含 PurchasesID 标志。基于此 ID,我需要计算给定购买中包含的包裹。有人愿意帮助将上述查询翻译成 linq 吗?非常感谢

标签: c# entity-framework linq lambda


【解决方案1】:

我不是 LINQ 方面的专家(远非如此),但我做过类似的事情。你说你已经完成了加入。如果是这样的:

var joinList = (from Item1 in Purchases
                            join Item2 in Packets
                            on Item1.Id equals Item2.PurchaseId 
                            select new { Item1, Item2 }).ToList();

那你就可以走了:

var subList = joinList.Where(j => j.Item1.Id == myId).Select(s => { new s.Item1, s.Item2.Price, Count = joinList.Where(j => j.Item1.Id == myId).Count() }).ToList();

这将为您提供一个类似于 SQL 返回的记录集的列表。请注意,您需要拆分 Item1 中的所有字段(相当于 Purchases.*)。另一种方法是在 Select 中将它们全部命名(如 s.Item2.Price)。

HTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2021-05-30
    • 2020-10-23
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多