0

最終的には、子が 2 つ未満のすべての親オブジェクトをフィルター処理したいと考えています。

クエリを作成する方法の例として、次のロジックを使用するグリッド ダッシュボードを使用して検索画面を作成しています。

var query = Session.QueryOver<Parent>(() => parentAlias);

if (!string.IsNullOrWhiteSpace(SearchCriteria.OpenedBy))
    query.Where(Restrictions.Eq(Projections.Property<Parent>(x => x.OpenedBy), SearchCriteria.OpenedBy));

if (SearchCriteria.OpenedDateStart != null)
    query.Where(Restrictions.Ge(Projections.Property<Parent>(x => x.OpenedAt), SearchCriteria.OpenedDateStart));

これは、この時点まで素晴らしく機能しています。

if (!string.IsNullOrEmpty(SearchCriteria.ChildrenAffected) && SearchCriteria.ChildrenAffected == "Multi")
    query.Where(() => parentAlias.Children.Count > 2);

.Count が機能しないことは理にかなっていますが、これは実際には linq ではありません。また、 .Count() はエラーをスローします。正直なところ、Restritions、JoinAlias など、思いつく限りのすべての組み合わせを試したような気がしますが、知識に基づいた試みの道を外れ、ずっと前に野生の推測の領域に入り込んでしまいました。

QueryOver 構文で子の数に基づいて親を除外するようにクエリを設定するにはどうすればよいですか?

-----注 ----- id がリストを取得した後に linq を使用することについて議論しましたが、クエリのセットアップでページングを行っているため、ページが戻った後にフィルターが適用されます。

4

1 に答える 1

2

サブクエリが必要です...

Children childrenAlias = null;
var subquery = QueryOver.Of<Children>(() => childrenAlias)
     .Where(() => childrenAlias.Parent.ID == parentAlias.ID)
     .ToRowCountQuery();
query.WithSubquery.WhereValue(2).Le(subquery);

のやり方がわからないので、やっていることに注意してくださいCount > 22 <= Count

.Where(() => childrenAlias.Parent.ID == parentAlias.ID)

あなたは書ける

.Where(() => childrenAlias.Parent == parentAlias)

うーん...カウント> 2が本当に必要な場合は、次のことができるはずです。

query.Where(Restrictions.Gt(Projections.SubQuery(subquery), 2));

また

query.WithSubquery.Where(() => subquery.As<int>() > 4);

(これは私が今まで使用したことがないものです... http://blog.andrewawhitaker.com/blog/2014/10/24/queryover-series-part-8-working-with-subqueries/から取得)

于 2015-04-29T12:50:59.927 に答える