2013-05-15 2 views
0

Я новичок в NHibernate & LINQ. У меня есть фрагмент кода, который, я думаю, можно оптимизировать. Пожалуйста, помогите мне сделать это.Нужно оптимизировать код LINQ с помощью Nhibernate

foreach (var geography in geographyList.OrderBy(x => x.Name)) 
{ 

    var introductionDateDetail = environment.IntroductionDateInfo 
             .IntroductionDateDetails 
             .OrderByDescending(x => x.ApplicationDate) 
             .FirstOrDefault(x => x.Geography.Id == geography.Id && 
                  x.VaccineDetail.Id == vaccineDetail.Id && 
                  x.MasterForecastInfo.Id == masterforecast.Id && 
                  x.ViewInfo.Id == viewInfoDetail.ViewInfo.Id); 

} 

Цикл for может перебирать до тысячи записей. И поэтому оператор LINQ также выполняется много раз. Можем ли мы написать фрагмент кода, где мы можем выполнить оператор LINQ только один раз?

+0

Это выглядит как случай N + 1 проблема запроса. Есть ли внешний ключ между Geography и IntroductionDetails и IntroductionDetailsInfo? Затем вы можете использовать метод «Fetch», чтобы охотно загружать эти сведения о вводе при получении географических данных. Если нет - вы всегда можете сделать один запрос, чтобы получить все сведения о вступлении, где 'geographyIds.Contains (x.Geography.Id)' – Pako

+0

Нет никаких внешних ключей между Geography и IntroductionDetails и IntroductionDetailsInfo. Пожалуйста, можете быть более конкретным при выполнении одного запроса, чтобы получить все сведения о вступлении? – user2299182

ответ

0

Вы можете попробовать что-то вроде этого:

var geographiesId = geographyList.Select(g => g.Id); 
var introductionDetails = environment.IntroductionDateInfo 
            .IntroductionDateDetails 
            .OrderByDescending(x => x.ApplicationDate) 
            .FirstOrDefault(x => geographiesId.Contains(x.Geography.Id) && 
                 x.VaccineDetail.Id == vaccineDetail.Id && 
                 x.MasterForecastInfo.Id == masterforecast.Id && 
                 x.ViewInfo.Id == viewInfoDetail 
+0

Спасибо Pako, который мне очень помог – user2299182

+0

Нет проблем. Начиная с ORM иногда бывает сложно и плохо работать, но большую часть времени он просто понимает, что происходит, и ищет другой способ решить проблему. Удачи! – Pako

+0

Да точно. Что делать, если я захочу загрузить указанный выше запрос LINQ в вопросе, если сущности имеют ссылку на внешний ключ? – user2299182

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