2011-07-03 58 views
1

如何使用Castle ActiveRecords和LINQ或HQL执行以下查询?如何使用LINQ或HQL执行以下SQL查询

SELECT a.id,s.classes,COUNT(p.id),MAX(p.date)截至去年,MIN(p.date)为第一
FROM帐户
LEFT JOIN校补ON s.account_id = a.id
LEFT JOIN用户U ON u.account_id = a.id
LEFT JOIN点p的p.user_id = u.id
WHERE支付= “S”
GROUP BY一个。编号

这些表是相关的我n以下面的方式: ER-Diagramm

我也有ActiveRecord类的所有表定义正确的关系(如果我做查询步骤它的工作,但它很慢,因为有很多行),我试过了这在投掷以下The method or operation is not implemented -Exception

var result = from account in AccountRecord.Queryable 
      join s in SchoolRecord.Queryable on account equals s.Account into schools 
      from school in schools.DefaultIfEmpty(null) 
      join user in UserRecord.Queryable on account equals user.Account 
      join p in PointsRecord.Queryable on user equals p.User into points 
      where account.PaymentType == "S" 
      select new { Account = account, School = school, Count = points.Count() }; 

:这不工作的以下

NHibernate.Linq.Visitors.QueryModelVisitor.VisitGroupJoinClause(GroupJoinClause groupJoinClause,QueryModel queryModel,的Int32指数)

+0

你不必按单曲做。类'要么得到一个有效的SQL查询? –

+0

不,'s.classes'只是学校表中的一个整列,表示学校的班级数量。我实际上需要帐户和学校表中的更多列,我在这里将其留给了主要问题,但SQL查询在发布时直接对de DB执行。 – ChrFin

回答

1

发现使用HQL解决方案 - 我还是开了LINQ的解决方案:

HqlBasedQuery query = new HqlBasedQuery(typeof(AccountRecord), 
    "SELECT a, s, COUNT(p), MIN(p.DateUTC), MAX(p.DateUTC) " + 
    "FROM AccountRecord a " + 
    "LEFT JOIN a.Schools s " + 
    "LEFT JOIN a.Users u " + 
    "LEFT JOIN u.Points p " + 
    "WHERE a.PaymentType=:payment GROUP BY a.Id"); 
query.SetParameter("payment", "S"); 
var result = from object[] row in (ArrayList)ActiveRecordMediator.ExecuteQuery(query) 
       select new 
       { 
        Account = row[0] as AccountRecord, 
        School = row[1] as SchoolRecord, 
        Count = row[2], 
        First = (new DateTime(1970, 1, 1, 0, 0, 0, 0)).AddSeconds(Convert.ToDouble(row[3])), 
        Last = (new DateTime(1970, 1, 1, 0, 0, 0, 0)).AddSeconds(Convert.ToDouble(row[4])) 
       }; 
+0

我现在要接受这个/我的解决方案,因为它的onyl工作解决方案我有自动取款机,但我仍然喜欢使用LINQ ... – ChrFin

0

我觉得你的Linq查询会是这样的:

var result = from a in AccountRecord.Queryable 
      join s in SchoolRecord.Queryable on a.id equals s.account_id 
      join u in UserRecord.Queryable on a.id equals u.account_id 
      join p in PointsRecord.Queryable on u.id equals p.user_id 
      where a.payment == "S" 
      group by a.id 
      select new 
      { 
       Account = a, 
       School = s, 
       Count = p.Count() 
      }; 

虽然我我不确定NHibernate会如何处理group byCount()的组合。如果不产生错误,您可能想要查看生成的SQL最终的结果。

如果不工作,你可能想选择的记录后面,和组/应用程序尽数相反,更像是:

var data = from a in AccountRecord.Queryable 
      join s in SchoolRecord.Queryable on a.id equals s.account_id 
      join u in UserRecord.Queryable on a.id equals u.account_id 
      join p in PointsRecord.Queryable on u.id equals p.user_id 
      where a.payment == "S" 
      select new 
      { 
      Account = a, 
      School = s, 
      Count = c 
      }; 
var grouped = data.ToList.GroupBy(x => x.Account.Id); 
+0

对不起,对于迟到的答案,但是这会引发我一个'无法投射类型为'Remotion.Data.Linq.Clauses.JoinClause'的对象来输入'Remotion.Data.Linq.Clauses.FromClauseBase'.' Exception ... – ChrFin