Обновление в LINQ to Objects - PullRequest
0 голосов
/ 11 мая 2009

Как сделать обновление в 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

Спасибо

Ответы [ 2 ]

1 голос
/ 11 мая 2009

Ну, я бы сделал обновления обязательно. Примерно так:

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) верно)

0 голосов
/ 19 января 2010

Для лучшей производительности и, как мне кажется, более чистого кода, вы можете использовать метод 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);
}
...