2015-10-02 17 views
7

Bu projeye sahibim ve yapmam gereken görevlerden biri, belirli bir nesnenin hangi sayfada göründüğünü bulmaktır. Nesnenin önceden tanımlanmış bir kimliği vardır ve kimlikler 0'dan N'ye kadar görünür, ancak potansiyel olarak değerleri atlayabilirler.Belirli bir ID'ye sahip bir öğeden önce kaç öğenin görüneceğini kontrol edin

Açıkçası, aradığım öğenin kimliğini kullanmanın 25 sanki işe yaramayacağı ve sayfa başına 10 öğenin olması gerektiği ancak bu öğelerden 8 tanesi eksik olduğu anlamına geliyor. iyi bir yol için varsa

int itemsPerPage = Convert.ToInt32(masterDbContext.Settings.First(x => x.Name == "ItemsPerPage").Value); 
int itemCount = masterDbContext.Items.OrderBy(x => x.Id).TakeWhile(x => x.Id < currentItemId).Count(); 
int pageNumber = (int)Math.Ceiling((double)itemCount/itemsPerPage); 

Response.Redirect("~/View/" + rootItem.Id + (pageNumber > 1 ? "/Page/" + pageNumber : "")); 

: daha iyi bir yolu olup olmadığını merak ediyorum, 2. Burada

ne var şimdi var sayfa 3 sığacak şekilde çalışacağını söyledi, ancak yalnızca sayfaya sığabilir Bunu yap, sorun değil. Ben sadece olduğunu umuyorum var, çünkü eminim TakeWhile veritabanında binerim Items alabildiğim bir süre alabilir.

Not: Bu yöntem şu anda çalışıyor gibi görünüyor.

int itemCount = masterDbContext.Items.FindIndex(x => (x.Id == given_ID)); 
+1

Neden burada GroupBy'ye ihtiyacınız var? masterDbContext.Items.Count (x => x.Id ieaglle

+0

@ieaglle Bu mükemmel çalıştı! –

+0

ve her iki sürümde aynı SQL kodunu tam olarak üretmek neredeyse kesindir. Yani bu sadece bir kod okunabilirlik optimizasyonu, performans değil. – ieaglle

cevap

4

gibi

+0

Bu mükemmel çalıştı! (Yanlışlıkla dışarıda bıraktığım bir durum dışında, ama bu senin suçun değil.) Ve TakeWhile'ın düşüşlerine dair açıklamayı takdir ediyorum. SQL ile çalışmayacağını hiç fark etmemiştim. (Her ne kadar mantıklı olsa da, 'TakeWhile'ı veya ona benzeyen her şeyi kullanan bir SQL sorgusu görmedim.) Sanırım sayım işini yapan kicker, kimlikleri her zaman sıralı olsa da Değerler hala düşükten yükseğe (her zaman) giderler. –

+0

@EBrown yardım ettiğine sevindim! – vittore

+0

TakeWhile bir imleç :-) –

-3

deneyin şey Neredeyse onu var. Eğer Öğeleri kimliğe göre sipariş ve bir sayıdan daha az kimliğiyle bunlardan kaç tane sayma olduğundan, sadece Count bu durumun kullanabilirsiniz:

var itemsPerPage = Convert.ToInt32(masterDbContext.Settings.First(x => x.Name == "ItemsPerPage").Value); 
var itemCount = masterDbContext.Items.Count(x => x.Id < currentItemId); 

Ayrıca TakeWhile LINQ uzantısı yöntemi için hiçbir doğrudan SQL maç yoktur. Yani, yapmanız gereken tek şey SQL bu benzerdir, LINQ sorgusu

+1

Lütfen şu soruyu okuyun: "ancak potansiyel olarak değerleri atlayabilirler." – Heslacher

+0

Belirtilen yüklemeyle tanımlanan koşullarla eşleşen bir öğeyi arar ve Listesinin tamamı içinde ilk oluşumun sıfır temelli dizinini döndürür. (https://msdn.microsoft.com/en-us/library/x1xzf2ca(v=vs.110).aspx) böylece 25 değil 25 tane alırsınız (aslında 16 az sıfır tabanlı) –

+0

Bir "Liste " olduğunu varsayalım? – Heslacher

2

bu SQL sağlayıcının çeşit kullanır varsayarsak SQL tercümesi başvuru istediğinizde, kullanmadığınız daha iyi:

SELECT COUNT([Id]) 
FROM [Items] 
WHERE [Id] < @currentItemId 

C# LINQ:

masterDbContext.Items.Count(item => item.Id < currentItemId); 
İlgili konular