LINQ查询连接两个表并从表B中选择与表A对应的最新记录

时间:2016-03-24 19:18:59

标签: c# sql-server linq

我有两张桌子。表一包含区域列表,表二包含样本列表,每个样本行包含Area_ID作为外键。

我需要检索Area表中的所有记录,只包含最新的相应Sample Status。我有这个查询,但它只返回一个带有Sample表中最新样本的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();

1 个答案:

答案 0 :(得分: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
                    };