加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 当param不为null Npgsql时,在linq查询中包含where子句

发布时间:2020-12-15 20:57:58 所属栏目:百科 来源:网络整理
导读:我有以下方法在数据库中注册联系人,但在注册之前我检查联系人是否存在: bool RegisterContact(Contact contactInfo) { bool entityExists = _dbContext.Contacts.FirstOrDefault( p = (p.FilesID.Equals(contactInfo.FilesID)) (p.EmailAddress == (string.
我有以下方法在数据库中注册联系人,但在注册之前我检查联系人是否存在:

bool RegisterContact(Contact contactInfo) { 
          bool entityExists =
                        _dbContext.Contacts.FirstOrDefault(
                            p => (p.FilesID.Equals(contactInfo.FilesID))
                                 && (p.EmailAddress ==
                                     (string.IsNullOrEmpty(
                                         contactInfo.EmailAddress)
                                         ? p.EmailAddress
                                         : contactInfo.EmailAddress))
                                 &&
                                 (p.DisplayName ==
                                  (string.IsNullOrEmpty(
                                      contactInfo.DisplayName)
                                      ? p.DisplayName
                                      : contactInfo.DisplayName)));
                                                                          }

此查询包括搜索条件中包含值(非空)的字段(FilesID,EmailAddress,DisplayName)

这种技术在MSSQL中运行良好,今天我将数据库管理器改为PostgreSQL并使用Npgsql.

所有的东西都工作,除了上面的linq查询,它引发了一个异常消息:“无法确定参数$2的数据类型”

我被迫以这种方式解决它:

bool RegisterContact(Contact contactInfo)
{ 
    Contact entityExists = null;

      if (string.IsNullOrEmpty(contactInfo.EmailAddress) &&
                        (string.IsNullOrEmpty(contactInfo.DisplayName)))
                        entityExists =
                            _dbContext.Contacts.FirstOrDefault(
                                p => p.FilesID.Equals(contactInfo.FilesID));

                    if (!string.IsNullOrEmpty(contactInfo.EmailAddress) && string.IsNullOrEmpty(contactInfo.DisplayName))
                        entityExists =
                            _dbContext.Contacts.FirstOrDefault(
                                p =>
                                    p.FilesID.Equals(contactInfo.FilesID) &&
                                    p.EmailAddress == contactInfo.EmailAddress);

                    if (string.IsNullOrEmpty(contactInfo.EmailAddress) && !string.IsNullOrEmpty(contactInfo.DisplayName))
                        entityExists =
                            _dbContext.Contacts.FirstOrDefault(
                                p =>
                                    p.FilesID.Equals(contactInfo.FilesID) &&
                                    p.DisplayName == contactInfo.DisplayName);


                    if (!string.IsNullOrEmpty(contactInfo.EmailAddress) &&
                        !string.IsNullOrEmpty(contactInfo.DisplayName))
                        entityExists =
                            _dbContext.Contacts.FirstOrDefault(
                                p =>
                                    p.FilesID.Equals(contactInfo.FilesID) &&
                                    p.EmailAddress == contactInfo.EmailAddress &&
                                    p.DisplayName == contactInfo.DisplayName);

}

这是Npgsql错误还是设计错误?该问题的任何已知解决方案/解决方法?

解决方法

我目前有同样的情况.我认为问题是NpgSQL缺乏对string.IsNullOrEmpty的认可.

我用空字符串检查替换了测试,始终将输入参数识别为非NULL.

– 不好

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"
                   };

– 好:

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,true) == 0)
                   && (string.Compare(sel_mar,true) == 0 || string.Compare(art.MAR,DES_DIS = art.DIS == 1 ? "Si" : "No"
                   };

但我不认为这是解决方案.我将向NpgSQL报告此案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读