2011-07-03 4 views
1

Castle ActiveRecordsとLINQまたはHQLを使用して次のクエリを実行するにはどうすればよいですか。LINQまたはHQLを使用して次のSQLクエリを実行する方法

アカウントからの最初の
AS SELECT a.id、s.classes、COUNT(p.id)、MAX(p.date)AS最後、MIN(p.date)
LEFTは学校ののJOIN s.account_id = a.id
LEFTユーザをJOIN U ON u.account_id = a.id
左側のBY P上p.user_id = u.id
WHERE支払い= "S"
GROUPポイントを登録しよう。 id

テーブルはi nは、次の方法: ER-Diagramm

(私はそれが動作手順でクエリを実行する場合は、しかし、多数の行があるとして、それは遅いです)私も定義された正しい関係を持つすべてのテーブルの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() }; 

で次The method or operation is not implemented -Exceptionを投げた:

NHibernate.Linq.Visitors.QueryModelVisitor.VisitGroupJoinClause(groupJoinClause groupJoinClause、queryModel queryModel、のInt32インデックス)HQLを使用したソリューションが見つかり

+0

あなたはS 'でグループする必要はありません。クラスは有効なSQLクエリを取得するか? –

+0

いいえ、 's.classes'は学校のクラスの量を示す学校表のint列です。実際には、アカウントと学校のテーブルからいくつかの列が必要ですが、ここではこれを主な問題にしていますが、投稿されたSQLクエリはDBに対して直接実行されたときに機能します。 – ChrFin

答えて

1

- 私はまだ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() 
      }; 

けれどもI:私はあなたの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

私は今、この/私の解決策を受け入れるでしょう。なぜなら、私はATMを持っているonylの作業ソリューションですが、私はまだLINQを使ってやりたいと思っています... – ChrFin

0

を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

関連する問題