2009-05-11 9 views
0

Comment faire une mise à jour dans LINQ to Objects. Essayant convertir SQL à LINQMise à jour dans LINQ to Objects

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

Comment convertir SQL ci-dessous pour 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 

Merci

+0

S'il existe une base de données à l'autre extrémité, vous ne travaillez pas avec LINQ to Objects. Il peut s'agir de LINQ to SQL, de LINQ to Entities ou de quelque chose d'autre, mais la différence est importante. –

Répondre

1

Eh bien, je ferais des mises à jour impérieusement. Quelque chose comme ceci:

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(); 
} 

Notez que les doubles contrôles nuls ne sont pas nécessaires en raison de la façon dont les comparaisons nulles sont traitées en C#. (c'est-à-dire (null == null) est vrai)

0

Pour de meilleures performances et ce que je pense être du code plus propre, vous pouvez utiliser la méthode ToLookUp. Si Q2 est grand, les performances seront meilleures car il n'y a pas de boucles imbriquées.

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); 
} 
Questions connexes