2011-08-19 25 views
2

我有一組結果從Linq返回到SQL查詢。每個結果有一個Name和一個SeriesId。該SeriesId可以是從1到N的任意值,如何更改默認OrderBy功能,以便首先按給定值排序?

所以結果可能最初來到這樣的數據庫進行(即任何順序):

 
FundA1 
FundA6 
FundA4 
FundC6 
FundC3 
FundC4 
FundB2 
FundB7 
FundB8 
FundB6 

我需要得到這些由Name第一有序化,然後按SeriesId但是我需要先顯示SeriesId == 6,然後按其他順序顯示。

因此,舉例來說,我需要

 
**FundA6** 
FundA1 
FundA4 
**FundB6** 
FundB2 
FundB7 
FundB8 
**FundC6** 
FundC3 
FundC4 

我知道這是我能夠通過Name訂單,然後SeriesId通過這樣做:

​​

但這將通過最低階的SeriesId價值第一。有沒有辦法讓我通過指定它應該從6開始而不是1開始訂購SeriesId來覆蓋此默認功能?

回答

4

試試這個:

return queryable.OrderBy(f => f.Name) 
       .ThenBy(f => f.SeriesId == 6 ? 0 : 1) 
       .ThenBy(s => s.SeriesId)); 

依賴於「假」訂貨比「真」前面 - 我認爲它會工作......它會在LINQ到對象,至少。

+0

你認爲做一些明確的事情會更清潔嗎?比如'ThenBy(f => f.SeriedId == 6?0:1)'(假設它轉化爲高效的SQL),而不是依賴某人理解真假的排序? –

+0

@Anthony:這是個好主意,是的。將編輯。 –

3
return queryable 
    .OrderBy(f => f.Name) 
    .ThenBy(f => f.SerialId == 6) 
    .ThenBy(f => f.SeriesId); 
+2

這就是我一開始就想到的,但我相信「系列6第一」排序仍然只是在*名稱之後*給出樣本數據。另外,我相信會把系列6放在*結尾*,因爲虛假是在真實之前訂購的。我認爲。也許。在星期五。 –

+0

嗯,我會嘗試在本地進行測試 – hunter

+0

嘗試了類似的順序,我已經按預期工作了 – hunter

0

創建您自己的比較器,並將它作爲OrderBy,ot ThenBy的第二個參數。 用戶OrderBy,您依賴於默認比較器,通常比較字符串的方式。但是你可以創建自己的,它總是會首先返回「6」。 PS。是的,這不會直接在LINQ2SQL上工作。但是,因爲,無論如何,你正在加載所有的值。你可以先加載它們,然後在內存中排序。

Here`s一個例子:

class Sample 
{ 
    string[] strings = new[]{ "123","123456", "12345"}; 

    public void SampleMethod() 
    { 
     var res = strings.AsEnumerable().OrderBy(s => s.Length, new MyComparer()); 
    } 

    class MyComparer : IComparer<int> 
    { 
     public int Compare(int x, int y) 
     { 
      if (x == 6) return -1; 
      return x - y; 
     } 
    } 
} 

.AsEnumerable()是需要的爲了用於LINQ2SQL將數據加載到存儲器中。

+0

我不相信你可以在LINQ to SQL中指定自定義比較器。 –

+0

如果你想使用它進行過濾,這將失去工作。但是對於排序:只需加載所有值並在內存中排序 –

+0

那麼可能需要說明如何做(例如使用AsEnumerable)。 –