[英]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.