2010-12-14 45 views
2

我有以下查詢入手:複雜的排序依據鏈接到另一個表

var query = from p in db.Products 
         from pc in p.NpProductCategories 
         where pc.CategoryId == categoryId 
         select p; 

我申請一些過濾它,並在最後,我想對結果進行排序:

if (orderBy == ProductSortingEnum.Name) 
        query = query.OrderBy(x => x.Name); 
       else 
        query = query.OrderBy(............); 

我的大問題(來自不知道linq太好)是這裏的ELSE。我如何根據不在當前結果集中的列對結果進行排序?我想以某種方式鏈接到orderby中的另一個linq查詢。 我想才達到的排序是使用產品編號 和NpProductVariant和產品之間的匹配排序價格的NpProductVariant

+0

請問使用* cursive *文字而不是BOLD的時候你高亮幾個字:) – Roberto 2015-10-23 18:23:59

回答

7

假設你有dbml的建立關係...

一對一(和多對一):

query = query.OrderBy(p => p.NpProductVariant.Price); 

對一對多:

query = query.OrderBy(p => p.NpProductVariants.Select(v => v.Price).Max()); 

另外:

var query = 
    from p in db.Products 
    where p.NpProductCategories.Any(pc => pc.CategoryId == categoryId) 
    select p; 
+1

你是一個天才!這是你給我的第二個變種,我正在尋找。非常感謝! – 2010-12-14 16:53:25

1

我想鏈接到NpProductVariants查詢你可以連接你的Join到您的查詢,只要因爲它正在返回相同的東西。因此,也許像(我不是100%肯定,因爲我還沒有嘗試過):

  query = from i1 in query 
       join i2 in query2 on i1.PropertyToJoin equals i2.PropertyToJoin 
       orderby i1.OrderProp1, i2.OrderProp2 
       select i1; 

但我認爲這可能是檢查生成的SQL所以它仍然是有效的一個好主意。

+0

問題是,稍後在代碼中我做了分頁:query.Skip(index * pageSize).Take(pageSize) .ToList(),它需要一個排序的枚舉。如果我在查詢中這樣做,我會得到一個異常:只有LINQ to Entities中的排序輸入支持'Skip'方法。方法'OrderBy'必須在方法'Skip'之前調用。 – 2010-12-14 14:43:31

+0

爲什麼這是一個問題?讓我們回過頭來看,如果你只有第一個'order by',它會起作用嗎?如果是這樣,只要生成的查詢具有相同的返回類型,就應該爲第二個工作。 – 2010-12-14 14:45:18