2017-11-03 5 views
0

Wie schreibe Frage so für linq? Ich fange an zu lernen, linq in letzter Zeit und kann immer noch nicht verstehen.Linq mit Update-Abfrage

string update = @"UPDATE Users SET Score = Score + @score, 
           Bonus = Bonus + @bonus 
         WHERE Username = @username"; 
cmd = new SqlCommand(update, con); 
cmd.Parameters.AddWithValue("@username", txtUsername.Text); 
cmd.Parameters.AddWithValue("@score", txtScore.Text); 
cmd.Parameters.AddWithValue("@bonus", txtBonus.Text); 
con.Open(); 
cmd.ExecuteNonQuery(); 
XtraMessageBox.Show("Updated!"); 
con.Close(); 

I dont‘wissen, warum es keine "Set" Klausel in Linq ist ... btw, ich Entity Framework

Antwort

0

Linq (und Entity Framework) verwenden, haben keine Möglichkeit zu Objekte in einer Sammlung ändern. Sie müssen die zu ändernden Objekte erfassen, ändern und anschließend EF auslösen, um die Daten in der Datenbank zu speichern.

// get the objects you want to modify 
var users = context.Users.Where(x => x.Username == myUsername); 

foreach (var user in users) 
{ 
    // change the properties 
    user.Bonus += bonusToAdd; 
    user.Score += scoreToAdd; 
} 

// EF will pick up those changes and save back to the database. 
context.SaveChanges(); 

Natürlich Username ist wahrscheinlich ein Primärschlüssel, so dass Sie nicht mehr als einen User Datensatz mit diesem Namen haben sollten. Ersetzen Sie einfach die Abfrage und foreach mit:

var user = context.Users.Single(x => x.Username == myUsername); 
user.Bonus += bonusToAdd; 
user.Score += scoreToAdd; 

Sie SingleOrDefault mit Ausnahmen zu helfen, verwenden können, wenn Sie einen Benutzer zum Nachschlagen versuchen, die es nicht gibt.

+0

Dank Sie gunr2171. Es klappt! –

0

Das Schlüsselwort update wird in Linq nicht verwendet. Sie können Aktualisierungen durchführen, wie folgt:

var users = (from p in Context.Users 
      where p.Username == username 
      select p).ToList().ForEach(x => 
      { 
       x.Score += score; 
       x.Bonus += bonus; 
      }); 
Context.SaveChanges(); 

Oder, wenn Sie nicht Lambda-Ausdrücke verwenden, bevorzugen würden, würde dies die gleiche Arbeit:

var users = (from p in Context.Users 
      where p.Username == username 
      select p).SingleOrDefault(); 

foreach (var user in users) 
{ 
    user.Score += score; 
    user.Bonus += bonus; 
}   

Context.SaveChanges(); 
+0

Das beantwortet die Frage nicht wirklich. Wenn Sie eine andere Frage haben, können Sie sie durch Klicken auf [Frage stellen] (https://stackoverflow.com/questions/ask) stellen. Sie können auch [Kopfgeld hinzufügen] (https://stackoverflow.com/help/privileges/set-bounties) hinzufügen, um mehr Aufmerksamkeit auf diese Frage zu lenken, sobald Sie genug [Reputation] haben (https://stackoverflow.com/help/ Whats-Reputation). - [Aus Bewertung] (/ review/low-quality-posts/17831777) – Dbl