【问题标题】:NHibernate Group By Many-to-Many AssociationNHibernate Group By 多对多关联
【发布时间】:2012-08-28 21:41:22
【问题描述】:

我需要执行一个查询来连接两个表,按值分组,并返回组键和计数。

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 做到这一点? Message表映射如下:

<?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>(... 

【问题讨论】:

    标签: c# linq nhibernate


    【解决方案1】:

    未测试

    // 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[]>();
    

    【讨论】:

    • 纯金,选项 1 就像一个魅力。我不认为对关联本身进行隐式连接 - 现在我看到了它是有道理的。谢谢=)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 2013-02-20
    • 2022-07-22
    相关资源
    最近更新 更多