2015-06-10 53 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:谢谢你的投入。它真的很棒,并按预期工作。非常感谢。 –