2014-09-25 45 views
-1

下面是完整的查询(不where)的名单加入,即工作:LINQ - 左外与在返回空值

public List<TipoResiduo> filtro(TipoResiduo objent) 
    { 
     using (var db = new DBEntities()) 
     { 
      var consulta = (from a in db.tb006_tipo_residuo 
          join cr in db.tb016_classe_residuo on a.fk_id_classe_residuo equals cr.id into trcr 
          from classeresiduo in trcr.DefaultIfEmpty() 
          join gr in db.tb017_grupo_residuo on a.fk_id_grupo_residuo equals gr.id into trgr 
          from gruporesiduo in trgr.DefaultIfEmpty() 
          join tfg in db.tb008_tipo_fonte_geradora on a.fk_id_tipo_fonte_geradora equals tfg.id into trtfg 
          from tipofontegeradora in trtfg.DefaultIfEmpty() 
          join civig in db.tb051_categoria_ivig on a.fk_id_categoria_ivig equals civig.id into trci 
          from categoriaivig in trci.DefaultIfEmpty() 
          join icap in db.tb048_ibama_capitulo on a.fk_id_ibama_capitulo equals icap.id into tric 
          from ibamacapitulo in tric.DefaultIfEmpty() 
          join isubcap in db.tb049_ibama_subcapitulo on a.fk_id_ibama_subcapitulo equals isubcap.id into tris 
          from ibamasubcapitulo in tris.DefaultIfEmpty() 
          join ires in db.tb050_ibama_residuo on a.fk_id_ibama_residuo equals ires.id into trir 
          from ibamaresiduo in trir.DefaultIfEmpty() 
          //where a.fk_id_classe_residuo == objent.fk_id_classe_residuo 
          select new TipoResiduo() 
          { 
           id = a.id, 
           no_tipo_residuo = a.no_tipo_residuo, 
           dt_cadastro = a.dt_cadastro, 
           fk_id_classe_residuo = a.fk_id_classe_residuo, 
           fk_id_grupo_residuo = a.fk_id_grupo_residuo, 
           nu_densidade = a.nu_densidade, 
           fk_id_tipo_fonte_geradora = a.fk_id_tipo_fonte_geradora, 
           fk_id_categoria_ivig = a.fk_id_categoria_ivig, 
           fk_id_ibama_capitulo = a.fk_id_ibama_capitulo, 
           fk_id_ibama_subcapitulo = a.fk_id_ibama_subcapitulo, 
           fk_id_ibama_residuo = a.fk_id_ibama_residuo, 
           no_classe_residuo = classeresiduo == null ? String.Empty : classeresiduo.no_classe_residuo, 
           no_grupo_residuo = gruporesiduo == null ? String.Empty : gruporesiduo.no_grupo_residuo, 
           no_tipo_fonte_geradora = tipofontegeradora == null ? String.Empty : tipofontegeradora.no_tipo_fonte_geradora, 
           no_categoria_ivig = categoriaivig == null ? String.Empty : categoriaivig.no_categoria_ivig, 
           no_ibama_capitulo = ibamacapitulo == null ? String.Empty : ibamacapitulo.de_ibama_capitulo, 
           no_ibama_subcapitulo = ibamasubcapitulo == null ? String.Empty : ibamasubcapitulo.de_ibama_subcapitulo, 
           no_ibama_residuo = ibamaresiduo == null ? String.Empty : ibamaresiduo.de_ibama_residuo 
           }); 
      return consulta.OrderBy(a => a.no_tipo_residuo).ToList(); 
     } 
} 

我的目标TipoResiduo有一些虚拟的领域只是为了方便,可以有一些空领域。

而当我尝试使用where进行过滤(删除//)时,该查询不显示任何内容。该函数的ObjEnt有一些先前填充的字段,当字段为空时,我想显示全部。

我想这也并没有什么:

where a.fk_id_classe_residuo == 
(objent.fk_id_classe_residuo == null 
? 0 : objent.fk_id_classe_residuo) 

我在这个新的,我应该怎么做才能使这项工作?

回答

0

你没有左外连接,所以如果objent.fk_id_classe_residuo为null,这将发现a.fk_id_classe_residuo = 0我不明白标题

- 不是所有的

where a.fk_id_classe_residuo == (objent.fk_id_classe_residuo == null ? 0 : objent.fk_id_classe_residuo) 

试试这个

where objent.fk_id_classe_residuo == null 
    or a.fk_id_classe_residuo == objent.fk_id_classe_residuo 
+0

我想你试过说:'where a.fk_id_classe_residuo == null || a.fk_id_classe_residuo == objent.fk_id_classe_residuo' 但是我已经修好了,thx无论如何。 :) – 2014-09-25 19:20:26

+0

我只能回答陈述的问题。 “该函数的目标有一些先前已填充的字段,当字段为空时,我想显示所有内容。”字段是对象。 id_classe_residuo == null不会显示全部 - 它显示null的值。 – Paparazzi 2014-09-25 19:28:13

-1

打我的头在墙上后,我找到了答案:

where objent.fk_id_classe_residuo == 0 ? true : classeresiduo.id == null 
&& classeresiduo.id == null ? false : a.fk_id_classe_residuo == objent.fk_id_classe_residuo 

问题是这objent.fk_id_classe_residuo来自一个下拉列表,并且当没有给出选项时,我将此fk_id设置为0。那么,有人会帮助我解决这个问题非常困难。 :|

但我感谢Blam的关注。 ;)

+0

classeresiduo.id == null && classeresiduo.id == null?虚假什么都不做。任何与null的比较都会返回false。 – Paparazzi 2014-09-25 19:32:22

+0

你是对的,再看一遍似乎很奇怪,但不知何故,这有效。 这也适用,但更有意义(我认为):'where objent.fk_id_classe_residuo == 0? true:objent.fk_id_classe_residuo == null && objent.fk_id_classe_residuo == null?假:a.fk_id_classe_residuo == objent.fk_id_classe_residuo' – 2014-09-25 20:47:21

+0

真的显式检查null并返回false当任何比较为null返回false无论如何更有意义? – Paparazzi 2014-09-25 20:56:33