【问题标题】:Select query in LINQ based on Foreign TableLINQ中基于Foreign Table的选择查询
【发布时间】:2011-03-02 00:28:58
【问题描述】:

我的 LINQ to SQL dbml 文件中有 2 个表、OrderDetails 和 Requests。 OrderDetailsID 是 Requests Table 中的外键。

我想编写查询以根据 OrderId 从 OrderDetails 中获取 UnitCost 的总和。 如果每个 OrderDetailsID 在请求表中有一行,并且 Requests.Last.RequestType="Refund" 我想从主要金额中减少总退款金额,否则如果没有基于 OrderDetailsID 的行,则添加到总和。

这是我实现它的方式。 我希望避免使用“For each”。

有什么解决办法吗?

 iRefund = (From od1 In dc.OrderDetails _
            Where od1.OrderID =1  _
            Select od1.UnitCost).Sum

 Dim objOrderDetails = (From od1 In dc.OrderDetails _
                       Where od1.OrderID =1  _
                       Select od1)

 For Each OrderDetail As ORM.Entities.OrderDetail In objOrderDetails
     If Not OrderDetail.Requests Is Nothing Then
         IF OrderDetail.Requests.Last.RequestType="Refund" Then
                   iRefund -= OrderDetail.UnitCost
         End If
     End If  
  Next

【问题讨论】:

    标签: asp.net sql vb.net linq


    【解决方案1】:

    如果你想使用 Linq 而不是 for-each 循环,你可以使用 List 的 ForEach 扩展方法:

    Dim objOrderDetails = (From od1 In dc.OrderDetails _
                           Where od1.OrderId = 1 _
                           Select od1).ToList()
    
    objOrderDetails.ForEach(AddressOf DecrementAmount)
    

    Private Sub DecrementAmount(ByVal d As OrderDetail)
        If d.Requests IsNot Nothing _
            AndAlso d.Requests.Count > 0 _
            AndAlso d.Requests.Last.RequestType = "Refund" Then
            iRefund -= d.UnitCost
        End If
    End Sub
    

    这假设 iRefund 是一个模块变量。

    【讨论】:

    • 我期待着找出是否有一种解决方案可以合并选择查询和 ForEach 并使用一个 LINQ 查询获得结果。但是谢谢你的回应。这很有帮助。
    • 合并是什么意思?您可以链接这两个语句,从而跳过声明 objOrderDetails,但不能取消 ToList(),因为 ForEach() 在 IQueryable 甚至 IEnumerable 上不可用。
    猜你喜欢
    • 2017-12-28
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多