LINQ, Должен ли я присоединиться или использовать вложенные SELECT NEW's - PullRequest
9 голосов
/ 30 января 2010

Мне нужно ниже 2 операторов LINQ. Они оба возвращают (казалось бы) один и тот же набор результатов. Может кто-нибудь объяснить мне, почему я должен использовать один путь против другого? Это так просто, как «Вы говорите картофель, я говорю картофель; вы говорите помидор, я говорю помидор» ?

Вот два варианта LINQ ->

1) Два lets ниже относятся к закрытым методам, которые берут ID и возвращают ИМЯ.

var business = from businesse in context.tblBusinesses
               where businesse.BusinessID == businessID
               join addresse in context.tblAddresses on businesse.BusinessID equals addresse.BusinessID
               let stateName = GetStateNameByID(addresse.StateID)
               let countyName = GetCountyNameByID(addresse.CountyID)
               select new
               {
                   businesse.BusinessName,
                   businesse.ContactName,
                   businesse.EmailAddress,
                   addresse.AddressLine1,
                   addresse.AddressLine2,
                   addresse.AddressLine3,
                   addresse.CityName,
                   State = stateName,
                   addresse.ZipCode,
                   addresse.ZipPlus,
                   County = countyName
               };

2)

var query = from businesse in context.tblBusinesses
            where businesse.BusinessID == businessID
            select new
            {
                businesse.BusinessName,
                businesse.ContactName,
                businesse.EmailAddress,
                Address = from addresse in businesse.tblAddresses 
                          select new 
                          {
                              addresse.AddressLine1,
                              addresse.AddressLine2,
                              addresse.AddressLine3,
                              addresse.CityName,
                              State = addresse.StateID,
                              addresse.ZipCode,
                              addresse.ZipPlus,
                              County = addresse.tblAdminCounty
                          }
            };

Ответы [ 2 ]

6 голосов
/ 30 января 2010

Когда вы смотрите профилировщик сервера sql, вы видите, что второй создает много запросов, но первый получает все данные в одном запросе. Таким образом, первый более эффективен.

1 голос
/ 30 января 2010

Вы уверены, что они дают тот же результат?

Похоже, что в первом примере ваше свойство Address будет сведено к нескольким свойствам, а во втором примере будет свойство Address, которое само содержит свойства.

Но в противном случае я бы сказал, что разница между присоединением и "внутренним отбором" будет зависеть от личных предпочтений. Я, вероятно, предпочел бы пойти с объединением, потому что я привык писать SQL и наличие слова join делает ваши намерения очевидными. Но я также не вижу проблем с использованием внутреннего выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...