3

私はこれを持っています

   using (ITransaction transaction = session.BeginTransaction())
        {
            Task tAlias = null;
            CompletedTask cAlias = null;

            List<Task> tasks = session.QueryOver<Task>(() => tAlias)
                .Where(Restrictions.In(Projections.Property(() => tAlias.Course.Id), courseIds))
                .Fetch(pt => pt.PersonalTaskReminders).Eager
                .List<Task>().ToList().ConvertToLocalTime(student);


            transaction.Commit();

            return tasks;
        }

    PersonalTaskReminders == Collection

したがって、タスクには多くのpersonalTask​​Remindersを含めることができます。ただし、personalTask​​Remindersを2つ設定すると、PersonalTask​​Remindersのコレクションにdbからのコレクションに2つの行が含まれるようになります)

同じタスクを2回返すこと。

したがって、そのタスクに50個のpersonaltaskRemindersがある場合。同じタスクで50件の結果が得られます。理由がわかりません。

熱心な読み込みを削除すると。期待どおり、データベースから1つのタスクを取得します。

4

2 に答える 2

17

熱心なフェッチが 2 つのテーブルとの結合を引き起こすため、これは明らかです。重複した結果を取り除くには、DistinctRootEntityTransformer を使用する必要があります。

ところで、NHibernate はIN節に対してより優れた構文を提供します。したがって、クエリは次のようになります。

    var tasks = Session.QueryOver<Task>()
            .WhereRestrictionOn(x => x.Id).IsIn(courseIds)
            .Fetch(pt => pt.PersonalTaskReminders).Eager
            .TransformUsing(Transformers.DistinctRootEntity)
            .List<Task>();
于 2011-06-03T07:28:05.500 に答える
1

Xelibrion のソリューションは、問題を解決する正しい方法です。

実行時に結果が重複する理由を理解するためにFetch、生成された SQL を比較できます。

Fetchのフィールドがなければ、SELECT単なるルート エンティティTaskフィールドです。

エンティティFetchのフィールドがに追加されました。したがって、同じものに対して 2 つのレジスターがある場合、結果に 2 つのレジスターが得られ、句はそれらを削除しません (フィールドが含まれているため、実際に返されるレジスターは異なるため)。PersonalReminderSELECTPersonalReminderTaskDISTINCTPersonalReminder

生成された SQL と生成された SQLTransformUsingはまったく同じですが、NH は返されたレジスタを処理して重複を削除します。

于 2013-09-24T11:28:38.710 に答える