4

NHibernateのLINQ実装でサポートされていない機能の問題に直面しています(QueryException: "プロパティを解決できませんでした:CreatedOn.Date of:Example.Comment")。

以下のエンティティを前提として、1日あたりのコメントをグループ化し、1日あたりのコメントの量を合計して統計を抽出したいと思います(当然、Fluent NHibernateで記述された追加のプロパティと正しいマッピングがあります)

public class Comment
{
    public virtual DateTime CreatedOn
    {
        get;
        set;
    }
}

私のLINQクエリは次のようになります(LINQ to SQLコンテキストに対して実行された場合、クエリは正常に機能します)。

var commentsPerDay = (from c in session.Linq<Comment>()
                      group c by new { c.CreatedOn.Date } into g
                      select new
                      {
                          Date = g.Key.Date,
                          Count = g.Count()
                      };

適切な解決策は、プロジェクトに貢献し、この問題を修正することです。

一方、(LINQ to)NHibernateに、この動作を注入できる拡張ポイントがあるかどうかを確認したいと思います。カスタムタイプを作成し、2番目のプロパティを作成時刻の日付部分にマッピングできることはわかっていますが、これはクエリに変換されないため、速度が遅くなりすぎると思います。

クエリを書き換えるアクセスは制限されています。クエリはLINQtoSQLで動作する必要があるため、HQLを使用できません。

4

2 に答える 2

1

さて、この質問は7年前に投稿されたので…それ以来、多くのことが変わったと思います。

簡単に言えば、最新バージョン(NHの3.3)で自然に感じる方法で日付をグループ化できます。NHのどのバージョンがこの機能を導入したのかわかりません。@Mikeには古いバージョンの解決策がありましたが、すべてのデータをネットワーク経由でプルすることはまったくパフォーマンスがありません。SomeDate.DateLinqtoNHで今すぐグループ化できます。

var results = _session.Query<Appointment>()
    .Where(ts => ts.StartTime > model.StartDate && ts.StartTime < endDateTime)
    .GroupBy(ts => new { ts.Account, ts.Date })
    .Select(g => new { g.Key.Account, g.Key.Date, AppointmentCount = g.Count() });
于 2016-04-12T18:42:06.663 に答える
0

私はそれに対する1つの解決策を見つけました、そしてそれは以下をすることです:

nhibernateからすべての結果を選択し、結果を取得するように強制します。次に、結果に対してgroupbyを実行できます。

それは次のようになります:

var comments = session.Linq<Comment>().Select(s=> new { s.CreatedOn } ).ToList(); //get all the comments into the results
var commentsPerDay = comments.GroupBy(c=>c.CreatedOn.Date).Select(foo => new {Date = g.Key, Count = g.Count());  //group by the results

申し訳ありませんが、私はラムダが好きですが、あなたはその考えを理解できると思います。大量の結果を取り戻さないように、クエリする日付範囲を制限することをお勧めします。

(以前、間違ったユーザーでgoogleにログインし、そのユーザーの下に投稿しました。)

于 2009-11-20T01:57:22.547 に答える