5

ラッパーを使用してテーブル User からデータを取得しています

IQueryable<StarGuestWrapper> WhereQuery =    
session.Linq<User>().Where(u => u.HomeClub.Id == clubId && u.IsActive).Select(
                    u =>
                    new StarGuestWrapper()
                        {
                            FullName = u.Name + " " + u.LastName,
                            LoginTime = u.SomeDateTime,
                            MonthsAsMember = u.SomeIntergerValue,
                            StarRating = u.SomeOtherInteregValue, 
                            UserPicture = u.Photo.PhotoData, 
                            InstructorFullName = u.SomeInstructorName,
                            TalkInteractionDuringSession = u.SomeBoolValue,
                            GoalInteractionDuringSession = u.SomeOtherBoolValue
                        });

これを問題なく IQueryable として使用しているため、実際にクエリを実行する前に便利なことを行うことができます。お気に入り :

WhereQuery.Skip(startRowIndex).Take(maximumRows).ToList();

等々。

この問題は、クエリで「where」ステートメントを使用すると発生します。例えば:

WhereQuery.Where(s => s.StarRating == 1)

「StarRating」がユーザーテーブルに存在しないという例外が実行時にスローされます-もちろん、それはラッパープロパティではありません。クエリを具体化すると機能します

WhereQuery.AsEnumerable().Where(s => s.StarRating == 1)

しかし、それは IQueryable を使用する感覚をすべて失い、私はこれをしたくありません。

奇妙で興味深いのは、ラッパーのすべてのプロパティがエラーをスローするわけではなく、すべてのブール値が where ステートメントで使用できることです。例 :

WhereQuery.Where(s => s.TalkInteractionDuringSession)

EntityFramework で動作しますが、NHibernate でこのエラーが発生するのはなぜですか?また、希望どおりに動作させる方法を教えてください。

4

1 に答える 1

2

古い nHibernate Linq プロバイダーは部分的な実装にすぎず、積極的に取り組んでいないことに注意してください。新しいより完全な linq プロバイダーが現在開発されており、NH3.0 の一部となる予定です (トランクをチェックアウトして構築し、この問題に対処しているかどうかを確認できます)。

データベースにアクセスしたい時点で ToList() を呼び出すようにコードを変更することをお勧めします。技術的にクエリに何かが起こる可能性がある時点で、将来の値を持つクエリをリポジトリから戻しています。EF と LINQ2SQL でさえ、考えられる linq クエリを SQL に変換することはできません。

これはあなたがやりたいことではないことは理解していますが、フレームワークを曲げて、これがまったく自然ではない方法で何かをしようとしていると思います。

于 2010-04-26T15:36:11.933 に答える