2

ご挨拶、

NorthwindサンプルテーブルCustomers、Orders、およびOrde​​rDetailsを考慮して、上記のテーブルに対応する関連エンティティを熱心にロードしたいのですが、エンティティをフェッチする前に、データベースで子エンティティを注文する必要があります。

基本的なケース:

var someQueryable = from customer in northwindContext.Customers.Include("Orders.OrderDetails") 
select customer;

ただし、これらのテーブルのランダムな列に関して、データベース側で(これらのエンティティをメモリにフェッチする前に)OrdersとOrderDetailsを並べ替える必要もあります。T-SQLのように、投影なしでそれは可能ですか?ソリューションがエンティティに対してe-SQLまたはLINQのどちらを使用するかは関係ありません。Webを検索しましたが、主に匿名型にデータを投影し、その匿名型を再クエリして子エンティティを希望の順序で取得するため、見つけた答えに満足できませんでした。また、CreateSourceQuery()を使用することは、データベース側でデータをそのまま取得する必要があるため、オプションではないようです。読み込みは熱心ですが、子エンティティを並べ替えるだけです。つまり、クエリを実行する前に「ORDER BY」を実行してから、希望する順序でエンティティをフェッチします。ご指導ありがとうございます。個人的なメモとして、私はMicrosoftにLinq to SQL(彼らはゆっくりと逃げているように見えます)と比較してもそのような未熟な形でEFをリリースすることに少し腹を立てているので、直接の言葉を許してください。このEFのものが、.NET FX 4.0のリリースバージョンで重大なバグなしに、はるかに良くなることを願っています。

4

3 に答える 3

8

実際、この問題に正確に対処するヒントがあります。

関連エンティティのソートは「サポート」されていませんが、Craig が示す射影アプローチを使用し、「関係修正」と呼ばれるものに依存することで、非常によく似た機能を得ることができます。

これを行う場合:

var projection = from c in ctx.Customers
                 select new {
                       Customer = c, 
                       Orders = c.Orders.OrderByDescending( 
                                 o => o.OrderDate 
                             )
                 };

foreach(var anon in projection )
{
   anon.Orders //is sorted (because of the projection)
   anon.Customer.Orders // is sorted too! because of relationship fixup
}

つまり、これを行うと:

var customers = projection.AsEnumerable().Select(x => x.Customer);

注文を並べ替えた顧客がいます。

詳細については、ヒントを参照してください。

お役に立てれば

アレックス

于 2009-06-15T18:51:16.383 に答える
2

あなたは2つの異なる問題を混同しています。1 つ目はデータベース内のエンティティを具体化する方法で、2 つ目は順序付きリストを取得する方法です。EntityCollection 型は順序付きリストではありません。あなたの例では、customer.Orders は EntityCollection です。

一方、特定の順序でリストを取得したい場合は、確かにそれを行うことができます。EntityCollection 型のプロパティに含めることはできません。例えば:

from c in northwindContext.Customers
orderby c.SomeField
select new {
    Name = c.Name,
    Orders = from o in c.Orders
             orderby c.SomeField
             select new {
                SomeField = c.SomeField
             }
}

Include の呼び出しがないことに注意してください。映しているので不要です。

Entity Framework は、LINQ to SQL のバックグラウンドから来ているため、期待どおりに機能しない場合がありますが、機能します。理解する前に非難することに注意してください。それが機能しないと判断すると、それがどのように機能するかを学ぶことができなくなります。

于 2009-06-15T18:18:39.163 に答える
0

あなたがた両方に感謝します。プロジェクションを使用して目的を達成できることは理解していますが、T-SQL の世界では、いくつかのネストされたクエリ (または結合) と order by で完全に可能であるため、簡単な方法があると思いました。一方、関心の分離は合理的に聞こえますが、私たちは現在エンティティ ドメインにいるので、2 人が推奨する方法を使用しますが、これは LINQ to SQL で AssociateWith を使用して達成する方が簡単でクリーンであることを認めなければなりません。

敬具。

于 2009-06-15T21:00:38.790 に答える