2014-09-25 71 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