2009-03-28 1 views
3

У меня есть оператор LINQ, где я хотел бы объединиться в первом адресе с псевдонимом «Я».Неправильно ли вызывать First() несколько раз в LINQ Select?

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

Я интересно:

  1. Это собирается повредить производительности, если я позвоню Первые несколько раз, как это?
  2. Есть ли более эффективная формулировка LINQ для этого?
  3. Как раз и понял, нужно ли мне .Include («Адреса»)?

ответ

11

Для LINQ к SQL, EF, и т.д., это, вероятно, не имеет значения - это вполне возможно, что перевод БЛИЦ сделает его идентичным в любом случае. Конечно, вы можете прокомментировать; -p

Но для LINQ-to-Objects (что очень буквально) это будет. Вы можете улучшить это с помощью 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

на этой ноте, я могу просто дайте мне = c.Addresses.FirstOrDefault (a.Nickname == "Me")? – bendewey

+0

, тогда сравните, где me! = Null – bendewey

+0

Также для записи я использую LINQ to EF – bendewey

Смежные вопросы