我需要通过使用2个条件和组条件来获取列表的结果。
为实现解决方案的一部分的查询是
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
不会抛出异常)。