2011-04-21 18 views
12

Bir grupla bir sorgudan bir sayı elde etmeye çalışıyorum ve yalnızca istediğim SQL'i NHibernate'in QueryOver sözdizimine dönüştürmeyi öğrenemiyorum.NHibernate QueryOver: Bir alt sorguda grupla bir satır sayısı alın

select count(*) from 
     (select Email from Entry 
     where (conditions...) 
     group by Email) as tmp 

basit doğru görünüyor:

Bu

SQL nedir?

Ben böyle yapmaya çalışıyorum nasıl olduğunu, ancak RowCount() çağrısı uzakta tamamen tarafından grubunu optimize etmek görünüyor:

var query = _unitOfWork.CurrentSession.QueryOver<ContestEntry>() 
     .Select(Projections.Property<ContestEntry>(x => x.Email), 
       Projections.Group<ContestEntry>(x => x.Email)); 

    return query.RowCount(); 

Bunun için Kriterlerini kullanarak sakıncası olmaz, ama ben sihirli dizelerden uzaklaşmamı sağlayan yeni (bana) QueryOver API'sı hakkında heyecan duyuyorum.

Güncelleme:

Bu uygulama, SQL CE üzerinde çalışan bir sayımı (örn seçme sayımı (ayrı Email)) içinde ayrı bir sorgu mu oluşturulan SQL kullanmak veremiyoruz.

bakınız: http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/80a1d7dd-22be-4583-b8f2-fcd8cde5ec53/ ve http://our.umbraco.org/wiki/install-and-setup/sql-server-ce-4-known-issues ("sayısında Farklı desteklenmiyor", sayfa aşağı yol yaklaşık 2/3) Bu kadar karmaşık bir sorgu neden ihtiyaç emin değilim

cevap

15

. Yalnızca farklı e-postalar belli kriterleri karşılayan sayısını istiyorsanız ben size SQL böyle bir şey kullanabilirsiniz düşünüyorum:

select count(distinct email) 
from Entry 
where (conditions...) 

Ve NHibernate en QueryOver API bu çeviri şöyle görünecektir:

int count = session.QueryOver<ContestEntry>() 
      .Select(Projections.CountDistinct<ContestEntry>(x => x.Email)) 
      .FutureValue<int>() 
      .Value;//query is not executed until here 

Bir şeyleri kaçırmadığım sürece, sanırım bu senin peşinde olduğun sonucu alacak. Ayrıca ilginç bulabileceğiniz bir "Farklı" projeksiyon ve bir .ToRowCountQuery() yöntemi de vardır.

+0

Teşekkürler Alex, haklısınız - bu SQL Server'da (ve muhtemelen diğer DB'lerde) düzgün çalışıyor. Ancak, bu şey üzerinde çalışan uygulama da bazı durumlarda SQL CE kullanır ve her ne sebeple SQL CE select sayımı (farklı x) desteklemiyor. Http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/80a1d7dd-22be-4583-b8f2-fcd8cde5ec53/ ve http://our.umbraco.org/wiki/install-and- sayfasına bakın. setup/sql-server-ce-4-bilinen-sorunlar – mmacaulay

+0

Bunu doğru cevap olarak işaretledim, çünkü teknik olarak, SQL Server'ı kullandığınız sürece. SQL CE için, çalışmak için satır içi SQL kullanmalıydım. – mmacaulay