2011-08-03 9 views
6

QueryOver <>構文を使用して次のSQL文を書くにはどうすればよいですか?NHibernate QueryOver <> - サブクエリに対する集計関数

SELECT COUNT(*) FROM (
    SELECT FirstName,LastName 
    FROM People 
    GROUP BY FirstName, LastName 
    ) as sub_t 

私はこれまで働いて、内側のクエリがあります。

var q = _session.QueryOver<Person>() 
    .SelectList(l => l 
     .SelectGroup(x => x.FirstName) 
     .SelectGroup(x => x.LastName)); 

をしかし、私はサブクエリでこれをラップし、それのうちの行数を取得する方法は考えています。それはできますか?

残念ながら、私のRDBMSダイアレクト(MsSqlCe40Dialect)はCOUNT DISTINCTをサポートしていないため、SelectCountDistinct()を使用する利点はありません。

答えて

0

IQueryOverのRowCountプロパティを使用することはできませんか?このように:

var totalRows = _session.QueryOver<Person>() 
.SelectList(l => l 
    .SelectGroup(x => x.FirstName) 
    .SelectGroup(x => x.LastName)).RowCount(); 
+1

残念ながら、GROUP BYはあなたの提案には保存されていません。SqlCe4とSQL Server 2008でテストしました。どちらの場合も、生成されたクエリは "SELECT count(*)y0_ FROM [People] this_"です。 – twerq

1

[OK]を、私はQueryOverを使用してbehing理由は分からないが、私はこのような何かをするだろう、私はあなたが探しているもの、それはあなたを与えるだろうと思う:

Session.CreateCriteria<Person>() 
       .SetProjection(
       Projections.ProjectionList() 
        .Add(Projections.GroupProperty("FirstName"))) 
        .Add(Projections.GroupProperty("LastName"))) 
       .List<Person>().Count(); 

希望が助けてくれます...

+0

残念ながら、これは目的のSQLを生成しません。レコードのリスト(膨大なもの)は、カウントされる前に.NETコードにロードされます。 – twerq

1

私はQueryOverに慣れていませんが、このタイプのカウントに対してサブクエリが不可能であった場合、以下の集計関数を使用しました。以前に気づいていなかった問題も投稿しました。

注:中程度のデータ量では約10倍遅くなります。

集計方法の特別な場合

同様の組み合わせ名 "ジョー・スミス" "ジョーズMith" (前提と〜あなたのデータセットではありません)VS

ため

SELECT 
COUNT(DISTINCT FirstName+LastName) 
FROM People 

対応

SELECT COUNT(DISTINCT FirstName+'~'+LastName) FROM People 

ヌル (As sumes ^データセットではない)空白を末尾

SELECT 
COUNT(DISTINCT IsNull(FirstName,'^')+'~'+IsNull(LastName,'^')) 
FROM People 

、AMDシングルクアッドコア上のデータの (80K行)

ベンチマーク

SELECT 
COUNT(DISTINCT IsNull(RTrim(FirstName),'^')+'~'+IsNull(Rtrim(LastName),'^')) 
FROM People 

ことでRTRIMはグループに固有のものであると思われます

80-100ms - 実行サブクエリメソッド(OPを参照)

800-1200ms - distincを使用する集約メソッド特殊なケースに対応することはそれほど顕著な違いをもたらさないようです。

関連する問題