2016-06-22 62 views
5

我有兩個表:如何根據ID列表對EF返回的對象進行排序?

User { 
    PK: UserId 
    ... 
} 

Product { 
    PK: ProductId, 
    FK: UserId 
    ... 
} 

我的ProductId S IN隨機格式的明細表。我不想對輸出結果進行排序,我也想爲每個產品ID包含用戶數據。

以下代碼以排序格式提供數據。我怎樣才能避免這種排序?我希望對象列表的順序與我們的產品列表相同。

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

有默認沒有這樣的東西排序。除非您指定OrderBy子句,否則數據庫將返回對象而不進行排序。他們*可能*顯示有序,因爲一些操作(例如Distinct)使用Sort。即使這些將是無序的,雖然如果查詢是昂貴的並行化 –

+0

什麼是'productIdList'?從另一個表加載的東西或只是一個ID列表? –

+0

productIdList包含Integer ID列表。 –

回答

2

我希望對象的名單在同一順序我們的產品清單。

我想通過我們的產品清單你的意思是用於過濾的productIdList變量。

你不能在LINQ to Entities中做到這一點,所以你必須切換到LINQ to Objects並在內存中進行排序。

一種方法是使用IndexOf方法:

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(); 

另一種更高性能的方法(當productIdList大),可以是使用中間詞典:

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'。事實上,這是一個使用連接而不是映射關係的錯誤 –

相關問題