2009-09-01 10 views
27

Sonuçlarımı yalnızca X kayıt miktarını almak için filtrelemek istiyorum. Take() nasıl çalışır? Bulduğum Bu sitede Linq Take() soru

: http://www.hookedonlinq.com/TakeOperator.ashx O atın diyor

() "kaynak null ise bir ArgumentNullException atar." Peki ne yapmalıyım? Take() 'de yaptığım her seferinde, bu tabloda bazı kayıtlar alacağımı veya garanti edemeyeceğimi garanti edemem.

İlk önce bir sayı yapmalı mıyım? Daha sonra kapmak için bazı kayıtlar olduğundan emin olmak için başka bir sorgu yapın?

Ayrıca bir Take (2) var, ancak sadece 1 rekoru aynı istisna atarsa ​​ne olur?

cevap

42

Boş bir başvuruyla boş bir koleksiyon arasında bir fark var. Boş bir koleksiyona katılmayı denemek güzel. Ve argüman, alınacak maksimum bir sayıyı belirtir, bu nedenle koleksiyondaki öğelerden daha fazlasını belirtmek de iyidir.

Bu gibi kesin ayrıntılar için MSDN'ye başvurmanızı öneririz.

Nesneler Linq için

: veritabanlarına Bağ İçin http://msdn.microsoft.com/en-us/library/bb503062.aspx

: Referans istisna boş http://msdn.microsoft.com/en-us/library/bb300906.aspx

+0

tüm sonuçları almak veya sonuç sayısını sınırlamak yapmak uzağa var mı? Sadece belirli koşullara bağlı olarak, sonuçların sayısını sınırlamak istiyorum ya da bunu ayırmak zorunda mıyım (farklı yöntemlere)? – chobo2

+1

@ chobo2: Bu tam olarak zaten böyle. Eğer 5 ürün için soruyorsunuz ama sadece 3 tane var, bu size 3 tane verecektir. –

9

yapıyorsun yalnızca olduğuna dair bir nesne kaynağına karşı örneğin:

List<MyObject> myList = null; 
myList.Take(5); // this would produce the error, of course 

zaman Linq to SQL'i yapıyorsanız, null referansı değil, verilerinizin bir EMPTY numaralandırıcısını döndürecektir. Aynı belirtecin üzerinde, mevcut olandan daha fazlasını almaya çalışıyorsanız, yalnızca mevcut tutarı alır. Bazı durumlarda sayfa verilerini ve kesinlikle listeden daha fazla kayıt isteyeceğim zamanın çoğunu sayfalamak için bu yöntemi kullanırım.

+0

'null' yöntemini çağırmak NullReferenceException atar. ArgumentNullException, Statik yöntem olarak al'ı çağırırsanız atılır: 'List list = null; Enumerable.Take (liste, 5); ' – knittl

2

Nesneyi çağıran nesne boşsa bir istisna gerçekleştirir. Şansınız boş bir nesneye sahip olmayacak ve hiç veya daha az satır içermeyecek (aynı anlama gelmediğinden emin olabilirsiniz). SQL bağlamında bir Linq kullanarak ve Where dönen sıfır sonuçların durumunda

Context.MyTable.Where(x => x.ID > 0).Take(2); 

arasında moda sorguluyorsunuz Eğer sorgu henüz çünkü

, sen boş istisna almazsınız idam edildi, daha sonra sadece 1 sonuç içermesi durumunda, sadece 1 sonucun geri alınmasıyla sonuçlanacaksınız. Take, kayıtların miktarını sınırlar. siz) (al önce

+0

" Sıfır sonuçlarının döndüğü durumlarda, sorgunuz henüz çalıştırılmadığı için boş bir istisna alamazsınız "- Hayır.Boş bir istisna alamazsınız çünkü 'Where' sonuç döndürmezse boş bir diziyi temsil eden bir nesneye boş olmayan bir referans verir. –

0

öğe sayısını Sayısı:

List<string> a = new List<string>(); 
      int count = a.Count > 12 ? 12 : a.Count; 
      a.Take(count); 
+0

Bu gereksizdir. [Belgeler] 'den (https://msdn.microsoft.com/en-us/library/bb503062 (v = vs.110) .aspx): "' ' dizgesini alın ve 'sayılar' kadar öğeleri verir. elementler verilmiş ya da “source” öğesi daha fazla element içermiyor. “count”, “source” içindeki elemanların sayısını aşarsa, “source” öğesinin tüm öğeleri döndürülür. ” –