2017-01-18 3 views
1

У меня есть таблица сайтов с тремя дочерними таблицами, которые могут иметь несколько записей для каждого сайта-образца. Мне нужно было сделать левое внешнее соединение, поэтому я все равно получаю все образцы сайтов, даже если у них не все связанные дочерние записи (сейчас одна из таблиц пуста). На основании некоторых исследований я сделал на SO, я сделал это:LINQ - множественные левые внешние соединения только для самых последних записей

SampleSiteDataViewModel viewModel = 
      (from s in db.SAMPLESITES_EVW 
      from b in db.BACTERIA_EVW.Where(b => b.FIELDSITEID == fieldSiteId).DefaultIfEmpty() 
      from c in db.CHEMISTRY_EVW.Where(c => c.FIELDSITEID == fieldSiteId).DefaultIfEmpty() 
      from m in db.MACROS_EVW.Where(m => m.FIELDSITEID == fieldSiteId).DefaultIfEmpty() 
      where s.FIELDSITEID == fieldSiteId 
      select new SampleSiteDataViewModel 
       { 
        MPN_ECOLI = b.MPN_ECOLI, 
        DO_PERCENT = c.DO_PERCENT, 
        PH = c.PH, 
        TDS = c.TDS, 
        TEMP_C = c.TEMP_C, 
        OE = m.OE, 
        DESCRIP = s.DESCRIP 
       }).FirstOrDefault(); 

Однако я понял, что это не обязательно будет возвращать самые последние бактерии/химия/запись макросов, если есть несколько записей, так как он ISN» t отношение от 1 до 1. Итак, я попытался заменить .DefaultIfEmpty с .OrderByDescending(b => b.SAMPLEDATETIME).FirstOrDefault(), но я получил эту ошибку:

«Выражение типа„BACTERIA_EVW“не допускается в последующем из пункта в выражении запроса с типом источника„DbSet“Тип вывода не удалось. в вызове «SelectMany» «

Как я могу правильно выбрать только самые последние записи, сохраняя при этом ситуации, когда записей нет? Я думаю, было бы проще разбить его на несколько запросов linq, но я предпочел бы сделать это в одном вызове базы данных, если это возможно.

ETA - это использование базы геоданных ESRI, загружаемой в SQL Server, с использованием модели «Код сначала из базы данных», которая (я считаю) не позволяет использовать свойства навигации с использованием этого метода.

+0

@Gert Arnold - Если я понимаю ваш вопрос (может быть, я этого не делаю), это потому, что на самом деле это базовая база данных ESRI, и нам пришлось добавить модель как «Код сначала из базы данных», поэтому он загрузил ее без какой-либо навигации свойства. – Ella

+0

Думаю, я, должно быть, ошибся в том, что означает LINQ to SQL. Я обновлю теги на Entity Framework. – Ella

ответ

2

Вы почти находитесь.

Замена

.DefaultIfEmpty() 

звонки с

.OrderByDescending(b => b.SAMPLEDATETIME).FirstOrDefault() 

прекрасно. Но он изменяет тип результата из последовательности в отдельный элемент, поэтому вам также нужно заменить соответствующие ключевые слова from ключевыми словами let, и все готово.

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