Dot-Net

從 VS2010 升級到 VS2012 後,Linq to EF Join 拋出“索引超出範圍”

  • October 5, 2012

從 Visual Studio 2010 升級到 2012 後,程式碼開始在使用聯接的 Linq 查詢上拋出“ArgumentOutOfRangeException - 索引超出範圍。必須為非負數且小於集合的大小。參數名稱:索引”。

以下在 LINQPad 中製作的簡單範例(使用 EF 數據模型)給了我 ArgumentOutOfRangeException:

void Main()
{
   var iq1 = Customers.Select(ap => ap.ID);
   var iq2 = iq1.Join(Customers.Select(ap => ap.ID),
                   a => a,
                   b => b,
                   (a, b) => new { a });

   iq2.Dump(); 
}

將前面的範例更改為返回一個包含連接兩邊的匿名對像不會給出 ArgumentOutOfRangeException 並給出預期的結果:

void Main()
{
   var iq1 = ActionPlans.Select(ap => ap.ID);
   var iq2 = iq1.Join(ActionPlans.Select(ap => ap.ID),
                   a => a,
                   b => b,
                   (a, b) => new { a, b });

   iq2.Dump(); 
}

好的,所以由於某種原因,我不得不返回連接的兩邊,但後來我嘗試使用虛擬值代替以下範例,該範例也沒有問題地執行:

void Main()
{
   var iq1 = ActionPlans.Select(ap => ap.ID);
   var iq2 = iq1.Join(ActionPlans.Select(ap => ap.ID),
                   a => a,
                   b => b,
                   (a, b) => new { a, x = 1 });

   iq2.Dump(); 
} 

以第一個範例為例,將 ToList() 添加到第一個查詢也使其執行沒有問題:

void Main()
{
   var iq1 = ActionPlans.Select(ap => ap.ID).ToList();
   var iq2 = iq1.Join(ActionPlans.Select(ap => ap.ID),
                   a => a,
                   b => b,
                   (a, b) => new { a });

   iq2.Dump(); 
}

**重要提示:**在沒有升級 Visual Studio 2012 的工作站上嘗試第一個查詢可以正常工作!

誰能確認/解釋這個新的“功能”?:-)

Erwin,只是為了結束這個循環:我們已經確認這是我們最近在 LINQ to Entities 中引入的一個錯誤,我們正在尋找解決方法。非常感謝您的報告!

在進行了更多調查之後,我得出的結論是,問題是我從 Linq 查詢返回的匿名類,我認為不再允許返回只有一個欄位的匿名類,我知道不需要將欄位包裝在匿名類中,但是……正如我所說,這在升級之前有效。

以下範例給了我“ArgumentOutOfRangeException - 索引超出範圍”:

void Main()
{
   var iq1 = ActionPlans.Select(ap => ap.ID).ToList();
   var iq2 = iq1.Join(ActionPlans.Select(ap => ap.ID),
                   a => a,
                   b => b,
                   (a, b) => new { a });

   iq2.Dump();
}

下一個範例按預期工作:

void Main()
{
   var iq1 = ActionPlans.Select(ap => ap.ID).ToList();
   var iq2 = iq1.Join(ActionPlans.Select(ap => ap.ID),
                   a => a,
                   b => b,
                   (a, b) => a );

   iq2.Dump();
}

引用自:https://stackoverflow.com/questions/12489749