2在其中和1组按条件linq c#



我需要通过使用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不会抛出异常)。

最新更新