2012-09-19 3 views
12

Visual Studio 2010から2012にアップグレードした後、「ArgumentOutOfRangeException - インデックスが範囲外です。コレクションのサイズ。パラメータ名:インデックス "は、結合を使用したLinqクエリです。Linq to EF Joinスロー「VS2010からVS2012へのアップグレード後にインデックスが範囲外です」

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

参加の両側を含む匿名オブジェクトを返すために、前の例を変更するものではありません何らかの理由で、私は結合の両側を返す必要があったので、

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

[OK]を、その後私はまた、PRなしで実行代わりにダミー値を使用して次の例を試した:例外ArgumentOutOfRangeExceptionと与える結果は予想通りoblem:

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のアップグレードは正常に動作します。

誰もこの新しい「機能」を確認/説明できますか? :-)

+2

このバグは、LinqがEF Joinに提出した「VS2010からVS2012へのアップグレード後にインデックスが範囲外です」(https://connect.microsoft.com/VisualStudio/feedback/details/763986/linq- to-ef-join-throws-index-was-of-range-after-of-upgrade-from-vs2010-to-vs2012)が含まれています。それを再現できる場合は、Microsoftに伝えてください。修正があなたにとって重要な場合は、そこに "upvote"します。 –

答えて

6

アーウィンは、ちょうどこの上でループを閉じるために:

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

この次の例では、期待通りに動作します。私たちはLINQ to Entitiesで最近導入したバグであることを確認しました。修正の方法を探しています。それを報告してくれてありがとう!

+0

こんにちは@divenga ..この問題に関する最新情報はありますか? チームがVS2012にアップグレードした後、プロジェクト全体が停止します! – alaasdk

+1

私たちはこのバグの修正を他のいくつかと一緒に取得するよう努めています。私はそれがもっともらしいかどうかはわかりませんが、発見したように、匿名型に2番目のダミープロパティを追加することで問題は解決します。 –

+0

ちょっと@alaasdkあなたはマイクロドットコムでnetfx45compatで私達に連絡することができますか?あなたのチームのブロックを解除するのを手伝っています。 – Varun

4

これをもう少し調べてみたら、問題はLinqクエリから戻ってくる匿名クラスだということになりました。匿名クラスを返すことはもはや許されないと思いますその中にフィールドが1つしかないので、匿名クラスでフィールドを囲む必要はありませんが、アップグレード前にこれがうまくいったと私は言っていました。たとえば以下の

は私に「例外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) => a); 

    iq2.Dump(); 
} 
関連する問題