2016-03-24 42 views
2

我有兩個表。表1包含區域列表,表2包含樣本列表,每個樣本行包含Area_ID作爲外鍵。LINQ查詢加入兩個表並從表B中選擇對應於表A的最新記錄

我需要檢索我的區域表中的所有記錄,只顯示最近的相應樣本狀態。我有這個疑問,但它只是返回一個面積與樣品表最近的樣本:

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()只選擇從可用的集合第一個或NULL,如果集合爲空。 –

回答

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

如果使用導航屬性可能會更容易。假設你有一個一對多的關係AreaSample之間:

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

組加入解決方案完美工作!所以發生的是,將a和c加入到一個新的樣本分組中,然後使用FirstOrDefault過濾按日期分組的樣本?大! – emerfan

+1

相關知識;) – octavioccl

+0

說到組連接,這也應該處理沒有關聯樣本顯示的情況,因爲我們需要顯示所有區域(「我需要檢索我的區域表中的所有記錄。 「),一種方法是將狀態和日期字段更改爲: status = sample.sample_status == null? 「NA」:sample.sample_status, date =「」+ sample.sample_date 這就是我用在我的情況。 – NicolasW

相關問題