我需要使用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();
然而,它引发了我的错误
索引和长度必须指向字符串中的位置。参数 名称:长度
我知道这个错误的原因。但是,我想知道解决方案。
答案 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
不会抛出异常。)