2011-10-18 9 views
0

店舗が店舗ポータルにログオンしてからログオンしてからのデータを記録するテストデータベースがあります。Linq - 値が0の場合、次の値を得るにはどうすればいいですか

例: (ちょうど可視化の目的のために - ない実際のデータベース)

Stores 
Id Description  Address   City 
1 Candy shop  43 Oxford Str. London 
2 Icecream shop 45 Side Lane Huddersfield 

Connections 
Id Store_Ref Start     End 
1   2 2011-02-11 09:12:34.123 2011-02-11 09:12:34.123 
2   2 2011-02-11 09:12:36.123 2011-02-11 09:14:58.125 
3   1 2011-02-14 08:42:10.855 2011-02-14 08:42:10.855 
4   1 2011-02-14 08:42:12.345 2011-02-14 08:50:45.987 
5   1 2011-02-15 08:35:19.345 2011-02-15 08:38:20.123 
6   2 2011-02-19 09:08:55.555 2011-02-19 09:12:46.789 

私は、データベースからさまざまなデータを取得する必要があります。私はすでに最大と平均接続時間を得ています。 (だからおそらく非常に自明である..)私はまた、どの接続が最小限に抑えられたかに関するいくつかの情報を持っている必要があります。私はLinqのMin()関数をすぐに考えましたが、わかるようにデータベースには瞬時に開始し終了した接続も含まれています。したがって、そのデータは実際にはデータ解析に「有効」ではありません。

私の質問は最小値を取得する方法ですが、値が0の場合は、最も低い次の値を取得します。

私のLINQクエリこれまで(MIN()関数を実装する):

var min = from connections in Connections 
      join stores in Stores 
      on connections.Store_Ref equals stores.Id 
      group connections 
      by stores.Description into groupedStores 
      select new 
      { 
      Store_Description = groupedStores.Key, 
      Connection_Duration = groupedStores.Min(connections => 
              (SqlMethods.DateDiffSecond(connections.Start, connections.End))) 
      }; 

私はそれはしかし複数のクエリおよび/またはステートメントを有効な値を得ることが可能だということを知っているが、私は次の場合に思っていました私のプログラムはlinqクエリが返されることを期待しており、私の好みはプログラムを可能な限り軽く保つことになるので、1つのクエリですべてを行うことが可能です。

これを行うには偉大で簡単な方法が必要な場合は、それを共有してください。あなたの貢献は非常に高く評価されています! :)

答えて

0
var min = from connections in Connections.Where(connections => (SqlMethods.DateDiffSecond(connections.Start, connections.End) > 0) 
      join stores in Stores 
      on connections.Store_Ref equals stores.Id 
      group connections 
      by stores.Description into groupedStores 
      select new 
      { 
      Store_Description = groupedStores.Key, 
      Connection_Duration = groupedStores.Min(connections => 
              (SqlMethods.DateDiffSecond(connections.Start, connections.End))) 
      }; 

「0」の値をフィルタリングすると、少なくとも私が教えている正しい結果が得られます。

+1

私はもっ​​と難しいと思っていたが、それはとてもシンプルに変わった。私はそれについても考えなかった。 (私はラムダ式でそれほど多くの経験はまだありません)しかし、とにかく、ありがとう@フレデリック!非常に高く評価! – doc92

+0

これは最も簡単な解決策でした。あなたはまた、ステートメント内のどこにステートメントを置くことができます、ステートメントをより複雑にする、私がしたやり方は "検索のみ有効"と言っている – Frederiek

1

何のようなものでたっの期間を選択し、新しい、let節の前に、追加した場合:句

where duration != 0 
+0

これも動作します:)私もそこには、笑)。しかし、私は@ Frederiekのソリューション(それはコードが少ない)と一緒に行くつもりだと思うが、あなたの思考と入力に感謝! – doc92

+0

let節では、値が1回だけ計算されるという利点があります。 SqlMethods.DateDiffSecond(...)を複数回使用すると、毎回その関数が実行されます。だから私はあなたにいくつかの時間を節約することができます:) –

0

はどこを含む場合、その後

let duration = SqlMethods.DateDiffSecond(connections.Start, connections.End) 

そして追加Min値を計算する前に

groupedStores.Where(conn => SqlMethods.DateDiffSecond(conn.Start, conn.End) > 0) 
    .Min(conn => (SqlMethods.DateDiffSecond(conn.Start, conn.End)) 
+0

私はこの1つを試みたが、私はエラーを受けているようです(暗黙のうちに 'int型'を 'bool'に変換できません)? – doc92

関連する問題