簡體   English   中英

LINQ錯誤:從范圍''引用的'y'類型的變量'x',但未定義

[英]LINQ error: variable 'x' of type 'y' referenced from scope '', but it is not defined

我遇到了這個錯誤......

類型為'Xrm.sb_directdebitpaymentline'的變量'paymentLine'從范圍''引用,但未定義

...當我嘗試在以下代碼后執行'paymentLines.ToList()'時:

var payments = from payment in Crm.sb_directdebitpayments
               where payment.statuscode == 1
                     && Crm.sb_directdebitmandates.Any(mandate =>
                                                       mandate.sb_directdebitmandateid ==
                                                       payment.sb_directdebitmandateid &&
                                                       mandate.statuscode == 1)
               select payment;

var paymentLines = from paymentLine in Crm.sb_directdebitpaymentlines
                   where paymentLine.sb_paymentsent == isSent
                         && paymentLine.statuscode == status
                         && payments.Any(payment =>
                                         payment.sb_directdebitpaymentid ==
                                         paymentLine.sb_directdebitpaymentid &&
                                         payment.statuscode == 1)
                   select paymentLine;

如果有人對如何解決這個問題有任何想法,我將非常感激!

它是查詢語法和擴展方法(Any)的奇妙組合。

它看起來像是捕獲循環變量問題的變體。 paymentLines執行是延遲的,因此在執行payments.Any( )時捕獲的paymentLine行有什么價值?

嘗試將其重寫為Join。

我以前嘗試過把它寫成一個連接,但是失敗了。 但是我今天重新審視並弄清楚我做錯了什么; 它與where子句的順序有關(事實上我需要一段時間才能解決,我甚至需要多個where子句!)。 謝謝你的所有答案。 解決方案是:

var paymentLines = from paymentLine in Crm.sb_directdebitpaymentlines
                   join payment in Crm.sb_directdebitpayments on paymentLine.sb_directdebitpaymentid equals payment.sb_directdebitpaymentid
                   join mandate in Crm.sb_directdebitmandates on payment.sb_directdebitmandateid equals mandate.sb_directdebitmandateid
                   where mandate.statuscode == 1
                   where payment.statuscode == 1
                   where paymentLine.sb_paymentsent == isSent && paymentLine.statuscode == status
                   select paymentLine;

我相信你不能在Select之前調用Any() Any()返回一個boolean值。 我會把你在Any()所有代碼都放在Where ,然后在foreach子句之前檢查Any()

if (paymentLines.Any())
  {
foreach (var n in paymentLines)
         {
           //Do work
         }
  }

暫無
暫無

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

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