0

私の目標は、varbinary(max) フィールドが null でない場合に varbinary(max) データベース フィールドから値を返す linq to sql クエリを実行することです。以下のコードでは、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 ステートメントが true であるため、コード ブロックは null 値を返しました。2 つのパラメーターが渡されると、データベースに NULL 値があります。

「pdfquery.Count() == 1」のセクションがどこにあるか、私は試しました:

  • if (pdfquery.Any())
  • if (pdfquery.FirstOrDefault() != null)
  • if (pdfquery.FirstOrDefault().toArray().Length > 0)
  • それらのすべてが私に Null Value Exception を与えています。

    私は何が欠けていますか?クエリが null 値 varbinary(max) を返すタイミングを特定して、適切なアクションを実行するにはどうすればよいですか?

    更新 (2014 年 7 月 17 日): null 参照例外を try catch で処理することにしました。

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

    他の例外がスローされた場合にキャッチできるようにしたいので、これを行うのはあまり好きではありません。null 値が正常に処理されることを期待して、Byte[] を ?Byte[] に変更してみます。

    4

    1 に答える 1

    0

    where句に追加するだけです

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

    また、1 つの結果だけを期待する場合は、(FirstOrDefault ではなく) SingleOrDefault を使用します。最後に、このように Count() を使用すると、Count に対して 1 回、実際のデータに対して 1 回クエリが実行されるため、Count に対して不要なクエリが 1 つ作成されます。

    于 2014-07-14T22:17:13.293 に答える