2017-12-05 21 views
0

Where条件とGroupBy条件を使用してListの結果をフェッチする必要があります。2条件と条件による1つのグループLINQ C#

ソリューションの一部をachiveために働いていたクエリが

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

あなたの入力データは何ですか?いくつかのサンプルを入力してください。 – HimBromBeere

答えて

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

、あなたに小さな改善:

var errorQuery = AgentOpList.Where(x => !string.IsNullOrEmpty(x.LastError) || x.Status != "FINISHED") 
           .GroupBy(x => ....).ToArray(); 
+1

''''''''Substring(0、Math.Min(x.LastError.Length、30)) ''についてはどうですか? @FCinおそらく。 – FCin

+0

最終的な長さが元の長さと同じであれば、どうやって?それはとにかく新しいStringインスタンスを作成しますか? –

+0

@FCinをチェックすると、同じインスタンスが返されます。私は答えを編集します –

0

Substringは、末尾のスペースでそれをパディングにより、30文字より短い文字列を受け取ることはありませんことを確認してください:

var errorQuery = AgentOpList.Where(x => x.LastError != "" || x.Status != "FINISHED") 
    .GroupBy(x => x.LastError.PadRight(30, ' ').Substring(0, 30)).ToArray(); 

(SQLのSUBSTRINGが例外をスローしないと同じように、これはオブジェクトへのLINQであると仮定すると、 )。