嵌套的LINQ查询返回null

时间:2014-11-25 14:20:11

标签: c# linq entity-framework nested

我试图在第二个查询的where条件中使用第一个linq查询的结果,如下所示:

var query = (from ds in Datacenter.datastatus
             where ds.visible == "y"
             select new
             {
                 ds.Priority,
                 ds.country.Country_Name,
                 ds.DSFromDate,
                 ds.DSToDate,
                 ds.country.ReceptionType_Id,
                 receptiontype = Datacenter.reception_type
                                           .Where(x => x.Id_reception_type == ds.country.ReceptionType_Id)
                                           .Select(x => x.Name)
                                           .FirstOrDefault()
             }).ToList();

我们可以看到我正在尝试使用字段ds.country.ReceptionType_Id来获取对应于reception_type表的reception_type.Name属性。

外,不返回任何内容

但是,如果我从查询中删除以下块:

 receptiontype = Datacenter.reception_type.Where(x => x.Id_reception_type == ds.country.ReceptionType_Id).Select(x => x.Name).FirstOrDefault()

我得到了一个结果集,我可以看到字段ds.country.ReceptionType_Id的值存在

然后我还试图在where条件中设置一个固定值,如下所示:

receptiontype = Datacenter.reception_type.Where(x => x.Id_reception_type == 1).Select(x => x.Name).FirstOrDefault()

这次我得到了对于reception_type.id = 1

的reception_type.name值

同样,如果我设置x.Id_reception_type == 2或3或..

,我会获得reception_type.name的值。

那么,为什么我的第二个选择在where条件中使用固定的整数值但是没有使用值ds.country.ReceptionType_Id

编辑:

为了更清楚,我尝试进行三重连接:

  • datastatus表包含country_id
  • 国家/地区表包含recepetion_type_id
  • reception_type表包含我想要显示的相应名称

1 个答案:

答案 0 :(得分:0)

所以我设法使用以下lambda语法

找到完全相同查询的工作解决方案
var query = Datacenter.datastatus.Where(x => x.visible == "y")
                                 .Join(Datacenter.countries, 
                                       ds      => ds.Country_Id, 
                                       c       => c.Country_Id, 
                                       (ds, c) => new { ds, c })
                                 .Join(Datacenter.reception_type, 
                                       rcc      => rcc.c.ReceptionType_Id, 
                                       r        => r.Id_reception_type, 
                                       (rcc, r) => new { rcc, r })
                                 .Select(x => new 
                                                { 
                                                   x.rcc.ds.Priority,  
                                                   x.rcc.ds.country.Country_Name, 
                                                   x.rcc.ds.DSFromDate, 
                                                   x.rcc.ds.DSToDate,  
                                                   x.r.Name }
                                        ).ToList();