2016-06-22 19 views
5

は、私は2つのテーブルを持っています。出力結果を並べ替えるのではなく、各製品IDのユーザーデータも含めたいと思います。IDのリストに従ってEFによって返されたオブジェクトをソートするにはどうすればよいですか?</p> <pre><code>User { PK: UserId ... } Product { PK: ProductId, FK: UserId ... } </code></pre> <p>私はランダムな形式で<code>ProductId</code>のリストを持っている:

以下のコードは、データをソート形式で示しています。この並べ替えを避けるにはどうすればよいですか?私はオブジェクトのリストを私たちの製品リストと同じ順序にしたい。

List<Tables.Product> tblProductList = 
    repo.Products 
     .Include("User") 
     .Where(x => productIdList.Contains(x.ProductId)) 
     .ToList(); 
+3

をデフォルトの並べ替えのようなものはありません。 OrderBy句を指定しない限り、データベースはオブジェクトを順序なしで返します。一部の操作(たとえばDistinct)がSortを使用しているため、*が表示されることがあります。クエリが並列化するのに十分な高価なものであっても、これらは順序付けされません。 –

+0

'productIdList'とは何ですか?別のテーブルやIDのリストからロードされたものはありますか? –

+0

productIdListには、整数IDのリストが含まれています。 –

答えて

2

私は、オブジェクトのリストは、当社の製品リストと同じ順番になりたいです。

私はあなたがフィルタリングに使用productIdList変数を意味当社の製品リストで想定しています。

LINQ to Entitiesではこれを行うことができないため、LINQ to Objectsに切り替えてメモリ内で順序付けを行う必要があります。 IndexOf方法を使用することです

一つの方法:(productIdListが大きいとき)

var tblProductList = 
    repo.Products 
     .Include("User") 
     .Where(x => productIdList.Contains(x.ProductId)) 
     .AsEnumerable() // Switch to LINQ to Objects context 
     .OrderBy(x => productIdList.IndexOf(x.ProductId)) 
     .ToList(); 

別のよりパフォーマンスの高い方法は、中間辞書を使用することができます

var productsById = 
    repo.Products 
     .Include("User") 
     .Where(x => productIdList.Contains(x.ProductId)) 
     .ToDictionary(x => x.ProductId); 

var tblProductList = productIdList 
    .Select(productId => productsById[productId]) 
    .ToList(); 
+0

いつものように:) –

+0

10のproductIdListの場合、上記のクエリには10秒かかります。それを改善する方法はありますか? –

+0

元のクエリを取得するにはどのくらいの時間がかかりますか? –

-1
var tblProductList=(from product in repo.Products 
        join user in repo.Users on product.UserId equals user.UserId 
        select new { Product=product,User=user}).toList(); 
+1

ORMは結合ではなくリレーションを使用します。リレーションが既に定義されている場合、 'join'を使う理由は全くありません。実際には、関係をマッピングするのではなく、結合を使用するバグです –

関連する問題

 関連する問題