2012-08-27 59 views
1

我需要執行一個連接兩個表的查詢,按值分組,並返回組密鑰和計數。NHibernate Group By Many-to-Many Association

CREATE TABLE Message(
    ID INT NOT NULL 
, Note NVARCHAR(128)); 

CREATE TABLE Message_Users(
    MessageID INT NOT NULL 
, UserID NVARCHAR(128) NOT NULL); 

我需要執行這個查詢:

SELECT mu.UserID, COUNT(m.ID) 
FROM Message m 
JOIN Message_Users mu 
    ON m.ID = mu.MessageID 
GROUP BY mu.UserID; 

我怎樣才能做到這一點使用NHibernate的?消息表映射如下:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DataModel" namespace="DataModel.Message"> 
    <class name="Message" table="Message"> 
    <id name="ID"> 
     <generator class="native" /> 
    </id> 
    <bag name="AssociatedUsers" table="Message_Users" lazy="false"> 
     <key column="MessageID" /> 
     <element column="UserID" type="System.String" /> 
    </bag> 
    </class> 
</hibernate-mapping> 

我已經看過其他一些問題,但沒有達到相當這個用例(大量的GroupBy的,但不能與關聯; plenty of join, but not with a group by

兩個方向我已經開始準備:

//首先嚐試

// Doesn't work as message.AssociatedUsers is a collection, so mu.Key is actually a collection 
var query = transactionContext.Session.Query<Message>();  
var r = from message in query 
     group message by message.AssociatedUsers into mu 
     select new {UserID = mu.Key, Count = mu.Count()}; 

//第二次嘗試

var query = transactionContext.Session.QueryOver<Message>(); 
var join = query.Right.JoinQueryOver<string>(_message => _message.AssociatedUsers); 
var select = join.Select(
     // Select generic parameter doesn't seem to be related to the type of the join (<Message, string>) 
    Projections.Group<string>(... 

回答

2

沒有測試

// Option 1 
var r = from message in Session.Query<Message>() 
     from userid in message.AssociatedUsers 
     group userid by userid into g 
     select new { UserID = g.Key, Count = g.Count() }; 

// Option 2 
string userId = null; 
var r = Session.QueryOver<Message>() 
    .JoinQueryOver<string>(m => m.AssociatedUsers,() => userId) 
    .SelectList(list => list 
     .SelectGroup(() => userid) 
     .Select(Projections.Count())) 
    .List<object[]>(); 
+0

純金,選項1工作就像一個魅力。我沒有想到要在關聯本身上進行隱式連接 - 現在我明白了。謝謝=) – Travis