2016-03-24 3 views
2

У меня есть две таблицы. Таблица 1 содержит список областей, а в таблице 2 приведен список образцов, каждая строка выборки содержит Area_ID в качестве внешнего ключа.Запрос LINQ для объединения двух таблиц и выбора последних записей из таблицы B, соответствующих таблице A

Мне нужно получить все записи в моей таблице Area только с последним соответствующим статусом образца. У меня есть этот запрос, но он просто возвращает один район с самой последней пробы из образца таблицы:

var result = (
    from a in db.area 
    join c in db.sample 
    on a.location_id equals c.location_id 

    select new 
    { 
     name = a.location_name, 
     status = c.sample_status, 
     date = c.sample_date 
    }).OrderByDescending(c => c.date).FirstOrDefault(); 
+0

Это потому, что у вас есть FirstOrDefault(), который только выбирает первую из доступных коллекций или нулевого значение, если коллекция пуста. –

ответ

2

Решение может быть фильтрация вашей второй DbSet:

var result = from a in db.area 
       join c in db.sample.Where(s=>s.location_id==a.location_id).OrderByDescending(c => c.sample_date).Take(1) 
       on a.location_id equals c.location_id 
       select new 
        { 
         name = a.location_name, 
         status = c.sample_status, 
         date = c.sample_date 
        }; 

Другим решением может быть приложени group join:

var result = from a in db.area 
       join c in db.sample 
       on a.location_id equals c.location_id into samples 
       let sample=samples.OrderByDescending(c => c.sample_date).FirstOrDefault() 
       select new 
        { 
          name = a.location_name, 
          status = sample.sample_status, 
          date = sample.sample_date 
        }; 

Если вы используете свойства навигации, это может быть еще проще. Предположив у вас есть один ко многим отношений между Area и Sample:

var result =from a in db.area 
      let sample= a.Samples.OrderByDescending(c => c.sample_date).FirstOrDefault() 
      select new 
        { 
          name = a.location_name, 
          status = sample.sample_status, 
          date = sample.sample_date 
        }; 
+0

Решение группы Join отлично работает! Итак, что происходит, присоединяя a и c к новой группировке образцов, а затем фильтруя группировку образцов по дате с помощью FirstOrDefault? Большой! – emerfan

+1

Полезно знать;) – octavioccl

+0

Говоря об объединении групп, это также должно обрабатывать случай областей, не имеющих связанных образцов для отображения, так как нам нужны все отображаемые области («Мне нужно получить все записи в моей таблице« Место »с помощью. "), один из способов сделать это - изменить поля состояния и даты на: status = sample.sample_status == null? «NA»: sample.sample_status, date = "" + sample.sample_date Вот что я использовал в своем случае. – NicolasW

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