score:0

I currently have the same cases. I think the problem is the lack of recognition, by NpgSQL, of string.IsNullOrEmpty.

I replaced the test with a check on empty string, always recognizing as not NULL the input parameter.

-- bad

        var data = from art in _ctx.Set<Soleo.Model.DLAR>()
                   from iva in _ctx.Set<Soleo.Model.DLAI>().Where(k => k.DITTA == art.DITTA && k.COD == art.CIVA).DefaultIfEmpty()
                   from fam in _ctx.Set<Soleo.Model.DLFA>().Where(k => k.DITTA == art.DITTA && k.COD == art.FAM).DefaultIfEmpty()
                   from mar in _ctx.Set<Soleo.Model.DLMA>().Where(k => k.DITTA == art.DITTA && k.COD == art.MAR).DefaultIfEmpty()
                   from udm in _ctx.Set<Soleo.Model.DLUM>().Where(k => k.DITTA == art.DITTA && k.COD == art.UM).DefaultIfEmpty()
                   where art.DITTA == DLAUTH.Config.Current.DITTA && art.COD.Contains(sel_cod) && art.DES.Contains(sel_des)
                   && (string.IsNullOrEmpty(sel_fam) || string.Compare(art.FAM, sel_fam, true) == 0)
                   && (string.IsNullOrEmpty(sel_mar) || string.Compare(art.MAR, sel_mar, true) == 0)
                   && (art.DIS >= sel_dis_da && art.DIS <= sel_dis_a)
                   select new
                   {
                       COD = art.COD,
                       DES = art.DES,
                       DES_UDM = udm.DES,
                       DES_MAR = mar.DES,
                       DES_FAM = fam.DES,
                       DES_CIVA = iva.DES,
                       MAG1 = art.MAG1,
                       MAG2 = art.MAG2,
                       DES_DIS = art.DIS == 1 ? "Si" : "No"
                   };

-- good:

            var data = from art in _ctx.Set<Soleo.Model.DLAR>()
                   from iva in _ctx.Set<Soleo.Model.DLAI>().Where(k => k.DITTA == art.DITTA && k.COD == art.CIVA).DefaultIfEmpty()
                   from fam in _ctx.Set<Soleo.Model.DLFA>().Where(k => k.DITTA == art.DITTA && k.COD == art.FAM).DefaultIfEmpty()
                   from mar in _ctx.Set<Soleo.Model.DLMA>().Where(k => k.DITTA == art.DITTA && k.COD == art.MAR).DefaultIfEmpty()
                   from udm in _ctx.Set<Soleo.Model.DLUM>().Where(k => k.DITTA == art.DITTA && k.COD == art.UM).DefaultIfEmpty()
                   where art.DITTA == DLAUTH.Config.Current.DITTA && art.COD.Contains(sel_cod) && art.DES.Contains(sel_des)
                   && (string.Compare(sel_fam, "", true) == 0 || string.Compare(art.FAM, sel_fam, true) == 0)
                   && (string.Compare(sel_mar, "", true) == 0 || string.Compare(art.MAR, sel_mar, true) == 0)
                   && (art.DIS >= sel_dis_da && art.DIS <= sel_dis_a)
                   select new
                   {
                       COD = art.COD,
                       DES = art.DES,
                       DES_UDM = udm.DES,
                       DES_MAR = mar.DES,
                       DES_FAM = fam.DES,
                       DES_CIVA = iva.DES,
                       MAG1 = art.MAG1,
                       MAG2 = art.MAG2,
                       DES_DIS = art.DIS == 1 ? "Si" : "No"
                   };

But I do not think this is the solution. I will report the case to NpgSQL.


Related Articles