2在哪里和1组按条件LINQ C#

时间:2017-12-05 11:07:48

标签: c# linq lambda

我需要使用2 Where条件和GroupBy条件来获取List的结果。

有效解决部分解决方案的查询是

 var errorQuery = AgentOpList.Where(x => x.LastError != "")
                             .GroupBy(x => x.LastError.Substring(0, 30)).ToArray();

但是现在,我还应该在列表中包含另一个条件,所以条件是     x.Status != "FINISHED" 所以我尝试的最终查询是

var errorQuery = AgentOpList.Where(x => x.LastError != "" || x.Status != "FINISHED")
                            .GroupBy(x => x.LastError.Substring(0, 30)).ToArray();

然而,它引发了我的错误

  

索引和长度必须指向字符串中的位置。参数   名称:长度

我知道这个错误的原因。但是,我想知道解决方案。

2 个答案:

答案 0 :(得分:4)

LastError短于30个字符。

如果你正在使用linq对象,你可以创建一个新函数:

public bool TakeChars(string str, int chars) {
    if (str.Length < 30) { return str; }
    else return str.Substring(0,30);
}

然后使用它:

var errorQuery = AgentOpList.Where(x => x.LastError != "" || x.Status != "FINISHED")
                            .GroupBy(x => TakeChars(x.LastError, 30)).ToArray();

如果您不想创建新功能或者您正在使用linq to sql,我认为这样可行(@FCin):

 var errorQuery = AgentOpList.Where(x => x.LastError != "" || x.Status != "FINISHED")
                                .GroupBy(x => x.LastError.Substring(0, Math.Min(30, x.LastError.Length))).ToArray();

此外,对Where

的改进很小
var errorQuery = AgentOpList.Where(x => !string.IsNullOrEmpty(x.LastError) || x.Status != "FINISHED")
                                .GroupBy(x => .... ).ToArray();

答案 1 :(得分:0)

通过用尾随空格填充,确保Substring永远不会收到短于30个字符的字符串:

var errorQuery = AgentOpList.Where(x => x.LastError != "" || x.Status != "FINISHED")
   .GroupBy(x => x.LastError.PadRight(30, ' ').Substring(0, 30)).ToArray();

(假设这是对象的LINQ,因为SQL的SUBSTRING不会抛出异常。)