Dot-Net
從 VS2010 升級到 VS2012 後,Linq to EF Join 拋出“索引超出範圍”
從 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(); }