簡體   English   中英

當param不為null Npgsql時,在linq查詢中包含where子句

[英]Include where clause on linq query when param is not null Npgsql

我有以下方法在數據庫中注冊聯系人,但在注冊之前我檢查聯系人是否存在:

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

但我不認為這是解決方案。 我將向NpgSQL報告此案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM