2015-06-10 57 views
1

由3個個子串我有如下LINQ查詢,排序字段其在LINQ

var sortedResults = (from r in this.CurrentTemplateInfos 
         where r.EffectiveEnd == null 
         orderby r.Description 
         select r); 

從上述查詢,字段說明由通過科隆(:)分離3個個子串(Showtype:Show:StartDate-Endate)。現在根據新的要求i需要通過升序前兩個fields(Showtype:Show)並從StartDate降低的描述值,例如,

Show : Main Street Trolley : 6/12/2010 - 7/15/2010 

ShowType : Parades : 2/10/2010 - 6/16/2010 

ShowType : Parades : 6/17/2010 - 8/26/2010 

ShowType : Parades : 8/27/2010 - 10/26/2010 

輸出應該是

Show : Main Street Trolley : 6/12/2010 - 7/15/2010 

ShowType :Parades : 8/27/2010 - 10/26/2010 

ShowType : Parades : 6/17/2010 - 8/26/2010 

ShowType : Parades : 2/10/2010 - 6/16/2010 

請幫助我在此。

+0

什麼是'CurrentTemplateInfos'? –

+0

您需要實施Icomparer 。這裏是一個例子http://stackoverflow.com/a/985685/1305119 –

+3

爲什麼你在一個屬性中存儲多個信息?將它們彼此分開。爲'StartDate','EndDate'('DateTime'),'ShowType','Show'('String')添加其他屬性。 –

回答

2

使用助手類型將字段分成不同的字段,然後按子句的順序使用該字段。喜歡的東西:

// Elsewhere 
class SortFields { 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
    public DateTime StartDate { get; set; } 

    public static SortFields SplitInput(string input) { 
    // Factory... Implement split/parse logic 
    } 
} 

然後

from r in this.CurrentTemplateInfos 
where r.EffectiveEnd == null 
let fields = SortField.SplitInput(r.Description) 
// This means sort by Field1, then Field2 and then StartDate 
// and the default in each criterion is ascending unless you 
// specify descending keyword. 
orderby fields.Field1, fields.Field2, fields.StartDate descending 
select r 

注意,可以使用使用多個let條款做了分流/解析,但我認爲小幫手型更清晰。

+1

好主意。但我認爲最好的方法是將這些信息首先存儲在不同的屬性中。 –

+0

@TimSchmelter我同意。同樣實施'IComparable '這種類型會很好。 – Richard

1
var sortedResults = from r in this.CurrentTemplateInfos 
        where r.EffectiveEnd == null 
        let parts = r.Description.Split(':') 
        let firstPart = parts[0] + parts[1] 
        let startDate = DateTime.Parse(parts[2].Split('-').First().Trim()) 
        orderby firstPart, startDate descending 
        select r; 
+0

我正在寫幾乎相同的答案,但我會在'from'之後放置'where'。 –

+0

@ Dennis_E我同意,改變了。 –

+0

@ ErenErsönmez:謝謝你的投入。它真的很棒,並按預期工作。非常感謝。 –