2009-03-10 19 views
1

Ich habe dieses Code-Fragment:Gibt es eine bessere Möglichkeit, dieses LINQ-Fragment zu codieren?

SmsDataClassesDataContext dc = new SmsDataClassesDataContext(); 

     // Get the customer 
     Customer currentCustomer = dc.Customers.Single(c => c.Hash1 == forThisHash); 


     // Get from Name (LINQ to XML) 
     var q = from c in thisSmsPack.Descendants("from") 
       select c; 

     string from = q.First().Value; 

     foreach (XElement element in thisSmsPack.Descendants("to")) 
     { 
      // Create the queue 
      SmsQueue sq = new SmsQueue(); 
      sq.CustomerId = currentCustomer.CustomerId; 
      sq.MsgFrom = from; 

      sq.MsgTo = element.Attribute("name").Value; 
      sq.MsgPhone = element.Attribute("phone").Value; 
      sq.MsgBody = element.Attribute("msg").Value; 
      sq.Priority = currentCustomer.SendsSmsAtPriority; 
      sq.DontSendUntil = GetNextSendDate(); 

      // sq.TimeCreated = System.DateTime.Now; 

      currentCustomer.SmsQueues.Add(sq); 
     } 
     dc.SubmitChanges(); 

ich neue Instanzen von „SmsQueues“ erschaffe, die Werte bevölkern, und wenn die foreach-Schleife beendet ist übermittle ich die Änderungen. Angesichts der neuen Lambda/Linq/anonymen Typen, die .NET 3.5 hat, gibt es einen "moderneren" Weg, um das oben genannte zu erreichen?

Als eine Nebenfrage, möglicherweise verwandt, kann ich einen vorhandenen Typ, der aus verschiedenen Spalten besteht, im ausgewählten Teil des linq-Ausdrucks zurückgeben?

Angenommen, Sie drei Tabellen haben:

T1 == T1.Id, T1.Name

T2 == T2.Id, T2.Phone

T3 == T3.Name, T3 .phone, T3.SomethingElse

Kann ich eine LINQ-Abfrage durchführen, die zurückgibt:

T1.Name, T2.Phone, SomethingElseNew

Und wissen .NET, dass das vom Typ T3 ist (und es ist eine neue Instanz davon)? So, wenn ich SubmitChanges, neue T3-Instanzen in der DB eingefügt werden?

Ich weiß nicht, ob ich mich klar ausgedrückt: S

Antwort

3

Ich habe nicht über ein System zur Verfügung, dies zu testen, aber ich denke, das (oder etwas ganz in der Nähe) funktionieren soll.

CustomerId = currentCustomer.CustomerId; 
var sqrange = from element in thisSmsPack.Descendants("to")) 
       select new SmsQueue 
       { 
      // Create the queue 
       MsgFrom = from, 
       MsgTo = element.Attribute("name").Value, 
       MsgPhone = element.Attribute("phone").Value, 
       MsgBody = element.Attribute("msg").Value, 
       Priority = currentCustomer.SendsSmsAtPriority, 
       DontSendUntil = GetNextSendDate() 
      // TimeCreated = System.DateTime.Now 
      }; 
    currentCustomer.SmsQueues.AddRange(sqrange); 

EDIT: Fest die zahlreichen Syntaxfehler (wie in den Kommentaren abgegrenzt)

+0

Sie Wahrscheinlich muss AddRange() anstelle von Add() verwendet werden. – tvanfosson

+0

Die neue neue SmsQueue auswählen ist ein Tippfehler? Meintest du: wähle neue SmsQueue? Die Semikolons nach jedem Element sollten Kommas sein. Auch die currentCustomer.SmsQueues.Add (sq) (oder AddRange) kann nicht verwendet werden, weil "sq" nicht existiert, was soll ich dort hinzufügen? :( –

+0

Ich fand es. Ich brauchte zu verwenden: currentCustomer.SmsQueues.Add (sqrange); (es war offensichtlich, aber immer noch ...);) Ich habe AddRange anstelle von Hinzufügen und änderte die ";" für Kommas nach jeder Anweisung. Auch du hattest zwei mal "neu" in der Auswahl. Aber es hat funktioniert. Vielen Dank!!! –

0

Man könnte so etwas tun (Syntax off leicht sein kann, keine Intellisense hier):

var q = T1.Join(T2, t => t.Id, t2 => t2.Id) 
    select new T3{Name=t.Name,Phone=t2.Phone,SomethingElseNew="Chickens"}; 
+0

Danke, das half mir herauszufinden, dass ich Kommas anstelle von Semikolons brauchte. Wenn ich jetzt ein T4 und T3 hatte ein FK zu diesem T4 (T3.t4id), kann ich ein T4.T3s.Add() tun? Wie würde ich das neu erstellte T3 referenzieren? q.? –

+0

Wenn FK auf der DB-Seite korrekt eingerichtet ist, wird LINQ ohne Joins mit ihnen zurechtkommen und Sie können die Methoden der zugehörigen Objekte wie beschrieben aufrufen. q wäre ein IEnumerable , so würden Sie darauf zugreifen, wie Sie jede andere Sammlung (foreach-Schleife, Aufruf .first() usw.) –

Verwandte Themen