2012-09-19 20 views
12

Visual Studio 2010'dan 2012'ye yükseltme kodundan sonra "ArgumentOutOfOfRangeException - Dizin atılmaya başladı. Negatif olmayan ve daha az olmalıdır. Toplamanın büyüklüğü. Parametre adı: dizinLinq to EF Birleştirme, "Dizinin Aralık dışı olduğunu" VS2010'dan VS2012'ye yükselttikten sonra VS2012

basit (EF veri modeli kullanılarak) LINQPad yapılan örneğin bana ArgumentOutOfRangeException verir şunlardır: her iki tarafını içeren anonim nesneyi döndürmek için bir önceki örnekte değiştirme

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

vermez birleştirme nedense katılmak iki tarafını dönmek zorunda,

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

Tamam, ama sonra ben de bir pr olmadan idam yerine bir kukla değeri kullanarak aşağıdaki örneği, denenmiş: ArgumentOutOfRangeException ve verir sonuçları beklendiği gibi 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(); 
} 

ilk örneği alma ve aynı zamanda bir sorun olmadan çalıştırmak yapan ilk sorgu için ToList(): eklenmesini olmayan bir iş istasyonu ilk sorgu çalışmak:

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

Önemli Visual Studio 2012 yükseltmesi iyi çalışıyor!

Bu yeni "özellik" yi onaylayan/açıklayan var mı? :-)

+2

Bu hata [Linq to EF Üyelik atar atıyor. 'Dizininin menzili aralık dışıdır' ', VS2010'dan VS2012'ye yükseltildikten sonra] (https://connect.microsoft.com/VisualStudio/feedback/details/763986/linq- to-ef-join-atar-index-çıkış aralık-sonrası yükseltme-den-VS2010-to-vs2012 idi). Yeniden üretebilirseniz, Microsoft'a bildirin. Bir düzeltme sizin için önemliyse, o zaman orada "yükselt". –

cevap

6

Erwin, bu meselede döngüyü kapatmak için:

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

sonraki örnek beklendiği gibi çalışır: Kısa bir süre önce LINQ’un Varlıklar’a tanıttığımız bir hata olduğunu doğruladık ve bir çözüm bulmanın yollarını arıyoruz. Raporlama için çok teşekkürler!

+0

hey @divenga .. bu konuyla ilgili herhangi bir güncelleme var mı? Ekibimiz VS2012'ye yükseltildikten sonra tüm projemiz durduruldu! – alaasdk

+1

Birkaç hata ile birlikte gönderilen bu hatayı düzeltmek için çalışıyoruz. Makul olup olmadığından emin değilim, ama keşfettiğiniz gibi, anonim bir türe ikinci bir kukla özellik ekleyerek, sorun etrafında çalışacaktır. –

+0

hey @alaasdk Microsoft dot com şirketinde netfx45compat üzerinden bize ulaşabilirsiniz. Takımının engellemesine yardım etmek istiyorum. – Varun

4

Biraz daha araştırma yaptıktan sonra, sorunun Linq sorgusundan döndüğüm anonim sınıf olduğu sonucuna vardım, sanırım artık anonim bir sınıfa dönmesine izin verilmiyor. Sadece bir alanla, alanı anonim bir sınıfa sarmak için gerekli olmadığını biliyorum, ama ... ... bunu yükseltmeden önce çalıştığını söylediğim gibi. Örneğin ardından

bana "ArgumentOutOfRangeException - Dizin aralık dışında oldu" verir:

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