سؤال

لدي بيان LINQ التالي:

Dim PSNum As Integer = 66 
Dim InvSeq = (From invRecord In InvSeqDataSet.RptInvSeqDT.AsQueryable() _
                Where IIf(invRecord.IsPack_NumNull(), False, invRecord.Pack_Num = PSNum) _
                Select New With _
                {.Inv = invRecord.Invoice_Num, .Seq = invRecord.Inv_Seq}).FirstOrDefault()

invrecord.pack_num هو حقل من عدد صحيح. هذا يعني أنه عندما أحاول الوصول إليه ، إذا كان dbnull أحصل على strontlytepedexception. الرمز أعلاه يلقي هذا الاستثناء. ومع ذلك ، إذا قمت بإزالة "invrecord.pack_num = psnum" وفي مكانه وضع شيء مثل "True" ، فإن الكود يعمل بشكل جيد.

لذلك أعتقد أن سؤالي هو ، لماذا هذا invrecord.ispack_numnull () يعيد خطأ عندما تكون القيمة في الواقع dbnull وماذا يمكنني استخدامها كشرطية بدلاً من ذلك؟ لقد ضربت رأسي على الحائط لفترة من الوقت الآن ولا يمكنني العثور على حل لهذه المشكلة.

هل كانت مفيدة؟

المحلول

في VB.NET ، IIf() يقيم كل واحدة من حججها لأنها وظيفة ، وليس بيان لغة. لذا inv.Record.Pack_Num = PSNum سيتم تقييمها دائمًا.

يمكنك استخدام If() بدلاً من IIf() (نفس بناء الجملة) الذي يستخدم تقييم الدائرة القصيرة بحيث يعمل كل شيء كما هو متوقع.

على عقدة جانبية ، كن حذرًا مع And و Or التي لها نفس السلوك. يستخدم AndAlso و OrElse بدلاً من ذلك ، إذا كنت بحاجة إلى تقييم للدائرة القصيرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top