C# 如何使用LINQ或HQL执行以下SQL查询

C# 如何使用LINQ或HQL执行以下SQL查询,c#,sql,linq,hql,castle-activerecord,C#,Sql,Linq,Hql,Castle Activerecord,如何使用Castle ActiveRecords和LINQ或HQL执行以下查询 选择a.id、s.classes、COUNT(p.id)、MAX(p.date)作为最后一个,MIN(p.date)作为第一个 来自帐户a 以s.account_id=a.id左入学校s 在u.account上左加入用户u\u id=a.id p.user\u id=u.id上的左连接点p 其中payment=“S” 按a.id分组 各表之间的关联方式如下: 我还为定义了正确关系的所有表提供了ActiveRecor

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

选择a.id、s.classes、COUNT(p.id)、MAX(p.date)作为最后一个,MIN(p.date)作为第一个
来自帐户a
以s.account_id=a.id左入学校s
在u.account上左加入用户u\u id=a.id
p.user\u id=u.id上的左连接点p
其中payment=“S”
按a.id分组

各表之间的关联方式如下:

我还为定义了正确关系的所有表提供了ActiveRecord类(如果我按步骤进行查询,它会工作,但速度很慢,因为有很多行),我尝试了以下方法,但没有成功:

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索引)


使用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]))
                };

使用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]))
                };

我认为您的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将如何处理
groupby
Count()
组合。如果生成的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);

我认为您的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将如何处理
groupby
Count()
组合。如果生成的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);

您是否必须按
s.classes
分组才能获得有效的SQL查询?不,
s.classes
只是学校表中的一个int列,指示学校的班级数量。实际上,我还需要account and school表中的一些列,我在这里省略了这些列,以解决主要问题,但是直接对de DB执行发布的SQL查询是有效的。您不需要按
s.classes
分组来获得有效的SQL查询吗?不,
s.classes
只是学校表格中的一个int列,表示学校的班级数量。实际上,我还需要account and school表中的一些列,我在这里省略了这些列,以便将其保留到主要问题中,但是直接针对de DB执行SQL查询时,它是有效的。很抱歉回答得太晚,但这使我陷入了一个
无法将类型为“Remotion.Data.Linq.Clauses.JoinClause”的对象强制转换为类型为“Remotion.Data.Linq.Clauses.FromClauseBase”。
异常…很抱歉回答得太晚,但是这给我带来了一个
无法将类型为'Remotion.Data.Linq.Clauses.JoinClause'的对象强制转换为类型为'Remotion.Data.Linq.clausebase.
-异常…我暂时接受这个/我的解决方案,因为它是我有ATM的唯一工作解决方案,但我仍然希望使用Linq…我暂时接受这个/我的解决方案,因为这是onyl的工作解决方案,我有ATM,但我仍然希望使用LINQ。。。