0

LINQtoObjectsで更新を行う方法。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チェックは必要ないことに注意してください。(つまり(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 に答える