3 Stimmen

Ist es schlecht, First() mehrere Male in einem LINQ Select aufrufen?

Ich habe eine LINQ-Anweisung, wo ich in der ersten Adresse mit dem Nickname von 'Me' zusammenführen möchte.

using (var ctx = new DataEntities())
{
  return from c in ctx.Customers.Include("Addresses")
         let m = from a in c.Addresses where a.Nickname == "Me" select a
         where m.Any()
         select new
         {
           Id = c.CustomerId,
           m.First().Name,
           m.First().Address1,
           m.First().Address2,
           m.First().City,
           m.First().State,
           m.First().Zip,
           m.First().Email,
           m.First().PhoneNumber
         };
}

Das frage ich mich auch:

  1. Wird die Leistung beeinträchtigt, wenn ich First mehrmals auf diese Weise aufrufe?
  2. Gibt es eine bessere LINQ-Anweisung für diese?
  3. Ich habe gerade festgestellt, dass ich auch .Include("Adressen") einschließen muss.

10voto

Marc Gravell Punkte 970173

Für LINQ to SQL, EF usw. gilt wahrscheinlich spielt keine Rolle - es ist durchaus möglich, dass die TSQL-Übersetzung sie trotzdem identisch macht. Natürlich können Sie ein Profil erstellen, um sicher zu sein ;-p

Aber für LINQ-to-Objects (die sehr wörtlich ist) wird es. Sie können dies verbessern, indem Sie let :

return from c in ctx.Customers.Include("Addresses")
     let m = from a in c.Addresses where a.Nickname == "Me" select a
     where m.Any()
     let first = m.First()
     select new
     {
       Id = c.CustomerId,
       first.Name,
       first.Address1,
       ...
       first.PhoneNumber
     };

0 Stimmen

In diesem Sinne: Kann ich mich = c.Addresses.FirstOrDefault(a.Nickname == "Me") lassen?

0 Stimmen

Then compare where me != null

0 Stimmen

Auch nur für das Protokoll Ich bin mit LINQ zu EF

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X