繁体   English   中英

2位置和1按条件分组LINQ C#

[英]2 Where and 1 Group by Condition LINQ C#

我需要通过使用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();

但是,它引发了我错误

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

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

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到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();

确保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不会引发异常)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM