2010-02-26 16 views
11

Sorgunun sonucunun belirli bir öğesini almak için elementat(Int32) yöntemini kullanıyorum.LINQ, ElementAt (i) yöntemini tanımıyor;

var mds = db.TDP_MissioniDestinazioni.Where(p => p.MissioneID == missioneRow.MissioneID); 

destinazioneRow = mds.ElementAt(i); 

yöntem 'TimeEntModel.TDP_MissioniDestinazioni ElementAt [TDP_MissioniDestinazioni]
(System.Linq.IQueryable`1 [TimeEntModel.TDP_MissioniDestinazioni] Int32)' yöntem tanımadığı LıNQ varlıkları ve Bu yöntem bir mağazada ifadesine dönüştürülemez.

Neden bu hatayı alıyorum ve nasıl düzeltebilirim?

cevap

20

Tüm "önceki" sonuçları almaktan memnun musunuz? Öyleyse, ya onları önbelleğe almak için ToList() ya da AsEnumerable() numaralı telefonu arayın ve AsEnumerable ile AsEnumerable derleyicisini Queryable.ElementAt yerine Enumerable.ElementAt numaralı telefonu arayacak şekilde zorlayın.

Daha iyi bir yol olabilir (örn. Take veya Skip kullanarak) - daha büyük resim hakkında daha fazla bilgi verebilir misiniz?

16

Sadece Skip karıştırabilirsiniz ve First hile yapmak:

mds.Skip(i).First() 
+2

@Steven: Bunun çevirisi mds.Skip (i - 1) ile karşılaştırılabilir olur gibi bir fikir ne .İlk()? –

+1

@Jon: Umarım EF bunun için aynı SQL kodunu oluşturur, ancak benim eğitimli tahminim, 'mds.Skip (i-1) .First()' inin daha verimli SQL üretmesidir. İyi bir! – Steven

+6

".ElementAt (i)", 0 ile başladığından beri 'i-1 'yerine' .Skip (i) 'yi kullanmanız gerektiğini düşünüyorum. Yani,' .ElementAt (0)' eşdeğeri olmalıdır. 0) .İlk() '. Yine de neredeyse üç yıl geciktim. –

İlgili konular