0

如何在 LINQ to Objects 中进行更新。尝试将 SQL 转换为 Linq

Quality
        (
          TransactionID int,
          Quantity float,
          MaterialID int,
          ProductID int,
          ParameterID int,
          ParameterValue float,
          TotalTonnes float
        )

如何将以下 SQL 转换为 linq:

UPDATE  Q1
            SET     TotalTonnes = ( SELECT  SUM(Quantity)
                                    FROM    @Quality Q2
                                    WHERE   Q1.ParameterID = Q2.ParameterID
                                            AND ( ( Q1.MaterialID = Q2.MaterialID )
                                                  OR ( Q1.MaterialID IS NULL
                                                       AND Q2.MaterialID IS NULL
                                                     )
                                                )
                                            AND ( ( Q1.ProductID = Q2.ProductID )
                                                  OR ( Q1.ProductID IS NULL
                                                       AND Q2.ProductID IS NULL
                                                     )
                                                )
                                  )
            FROM    @Quality Q1

谢谢

4

2 回答 2

1

好吧,我会迫切地进行更新。像这样的东西:

foreach (var q1 in Q1)
{
    q1.TotalTonnes = (from q2 in Q2
                      where q1.ParameterID == q2.ParameterID
                        && q1.MaterialID == q2.MaterialID
                        && q1.ProductID == q2.ProductID
                      select q2.Quantity).Sum();
}

请注意,由于在 C# 中处理空比较的方式,不需要双重空检查。(即是真(null == null)的)

于 2009-05-11T05:24:07.410 回答
0

为了获得更好的性能和我认为更简洁的代码,您可以使用 ToLookUp 方法。如果 Q2 很大,这将是更好的性能,因为没有嵌套循环。

var Q2LookUp = 
    Q2.ToLookUp(q2 => new {q2.ParameterId, q2.MaterialID, q2.ProductId});
foreach (var q1 in Q1)  
{
    q1.TotalTonnes = 
        Q2Lookup[new {q1.ParameterId, q1.MaterialID, q1.ProductId}]
            .Sum(q2 => q2.Quantity);
}
于 2010-01-19T12:16:59.687 回答