0

我的目标是执行一个 linq to sql 查询,如果 varbinary(max) 字段不为空,它将从 varbinary(max) 数据库字段返回一个值。在下面的代码中,x.doc 是数据库中的 varbinary(max)。

我的代码的基础是这样的:

    var pdfquery = from x in dataContext.Statements
         where x.enccc == card && x.stDate == datetime      
         select x.doc;

                    if (pdfquery.Count() == 1 )
                    {
                        pdffile = pdfquery.FirstOrDefault().ToArray(); 
                    }
                    else
                    {
                     //go to a webservice to get pdffile and write it to the db
                     }

代码块返回空值,因为 if 语句为真。传递两个参数时,数据库中有一个空值。

“pdfquery.Count() == 1”部分在哪里,我试过:

  • if (pdfquery.Any())
  • if (pdfquery.FirstOrDefault() != null)
  • if (pdfquery.FirstOrDefault().toArray().Length > 0)
  • 所有这些都给了我一个空值异常。

    我错过了什么?如何识别何时返回空值 varbinary(max) 的查询以便我可以采取适当的措施?

    更新(2014 年 7 月 17 日):我决定使用 try catch 处理 Null Reference Exception:

         try
                        {
                            var pdfquery = from x in dataContext.Statements
                                           where x.enccc == card && x.stDate == datetime
                                           select x.doc;
    
                            pdffile = pdfquery.SingleOrDefault().ToArray(); //gets the binary data and converts it to a byte array
    
                        }
                        catch(NullReferenceException nux)
                        {
                            logger.LogDebug("No Binary Data Exists for Statement, making  Request ---- ",nux);
                            getStatment(unencArray); 
                            getByteArray(statementxml);  
                            writeByteArrayToDb(unencArray, pdffile); 
    
                        }
    

    我真的不喜欢这样做,因为如果它们被抛出,我宁愿能够捕获其他异常。我将尝试将我的 Byte[] 更改为 ?Byte[] 以希望能正常处理空值。

    4

    1 回答 1

    0

    Just add it to the where clause

    var pdfquery = from x in dataContext.CcStatements
                   where x.enccc == card && x.stDate == datetime && x.doc != null      
                   select x.doc;
    

    also if you are expecting just one result use SingleOrDefault (as opposed to FirstOrDefault). And finally if you use Count() like this you will make one unnecessary query for Count because the query will be executed once for Count and once for the actual data.

    于 2014-07-14T22:17:13.293 回答