2012-01-18 4 views
2

として格納加算番号は私には、以下のデータを有する:LINQ - ストリング

PK OrderNumber  USERDEFFIELD 
1  0001    10 
2  0001    25 
3  0002    20 
4  0002    22 
5  0002    NULL 
6  0003    ABC123 

UserDefField列がデータベースにVARCHAR型です。 LINQを使用して、注文ごとにSUM(UserDefField)を取得するにはどうすればよいですか? UserDefFieldのNULL値と非数値値はゼロとみなされます。 UserDefFieldは私がforeachループ内でこれを行うだろう知っている厳密にNULL可能な数値フィールドの場合

OrderNumber TotalQty 
0001   35 
0002   42 
0003   0 

を::

TotalQtyForThisOrder = orders.Sum(w => w.UserDefField ?? 0); 

しかし、文字列フィールドのために、何をする必要があり、結果は私が取得しようとしています完了?助けてくれてありがとうございました。

+0

チェックこのhttp://stackoverflow.com/questions/5754218/convert-string-to-int-in-ef-4-0 – ivowiblo

答えて

5
TotalQtyForThisOrder = orders.Sum(w = > { 
      int result; 
      Int32.TryParse(w.UserDefField, out result); 
      return result; 
}); 
+1

@ DavidHoerster:真実ではない。あなたはそれを初期化することができます。 –

+0

申し訳ありません - 私は間違っていました。おそらく私はより多くの睡眠(またはより多くのカフェイン)が必要です。 –

6

基本的に、私は言うだろう、あなたのスキーマがオフになっている:そのように解析可能であることを起こる場合は、番号としてテキスト値を処理している場合、あなたは本当に賢明なデザインと戦っています。

LINQクエリを作成してその合計がデータベースに存在するようにする方法がわかりません。おそらく、カスタム変換関数を書くか、あるいは "それを解析して0を返す"操作を行ったカスタムビューを作成したいと思うでしょう。

x = orders.Select(y => y.UserDefField) // To just bring down the right values 
      .AsEnumerable() 
      .Sum(text => { 
        int result; 
        // We don't care about the return value... and 
        // it even handles null input. (In any error condition, 
        // "result" will be 0 afterwards.) 
        int.TryParse(text, out result); 
        return result; 
       }); 

を...しかし、私はが本当には、あなたがした場合、あなたはおそらくすることができ、あなたのスキーマを再検討することをお勧めします:

あなたは、オブジェクトへのLINQの中に簡単に十分にそれを行うことができます。

+1

ありがとうございます@ジョンスキート。私は、スキーマがひどいことを最初に認めます。しかし、それは私が対処されていて、やり遂げることが期待されるカードです。それは11歳以上のデザインであり、すぐに変更する予定はありません。私はあなたのアプローチを試みます。 – FMFF

1

私はそうのような集計関数を使用します。

var result = orders.Aggregate(new Dictionary<OrderIdType, int>(), (accumulator, item) => { 
    int quantity; 
    if (!int.TryParse(item.USERDEFFIELD, out quantity)) 
     quantity = 0; 
    if (!accumulator.ContainsKey(item.OrderId)) 
     accumulator[item.OrderId] = quantity; 
    else 
     accumulator[item.OrderId] += quantity; 
    return accumulator; 
}); 
+0

が更新されました。 'int.TryParse'を忘れました。 –