【问题标题】:linq - left outer join with where returning list of nullslinq - 与返回空值列表的左外连接
【发布时间】:2014-09-25 16:00:02
【问题描述】:

这是完整的查询(没有where),它有效:

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之前填充了一些字段,当字段为null时,我想全部显示。

我也试过了,没用:

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

我是新手,我应该怎么做才能使它工作?

【问题讨论】:

    标签: c# asp.net linq


    【解决方案1】:

    你没有左外连接所以我不明白标题

    如果 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 
    

    【讨论】:

    • 我想你想说:where a.fk_id_classe_residuo == null || a.fk_id_classe_residuo == objent.fk_id_classe_residuo 但我已经修好了,谢谢。 :)
    • 我只能回答上述问题。 “函数的ObjEnt之前填充了一些字段,当字段为空时,我想全部显示。”场是对象。 id_classe_residuo == null 不会显示全部 - 它显示 null 的值。
    【解决方案2】:

    头撞墙后,我找到了答案:

    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 的关注。 ;)

    【讨论】:

    • classeresiduo.id == null && classeresiduo.id == null ? false 什么都不做。任何与 null 的比较都会返回 false。
    • 你是对的,再看一遍似乎很奇怪,但不知何故这有效。这也有效,但更有意义(我认为):where objent.fk_id_classe_residuo == 0 ? true : objent.fk_id_classe_residuo == null &amp;&amp; objent.fk_id_classe_residuo == null ? false : a.fk_id_classe_residuo == objent.fk_id_classe_residuo
    • 真正明确地检查 null 并在任何与 null 的比较返回 false 时返回 false 更有意义?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多