linq-値= 0の場合、最小値を取得するには、次の値を取得します

StackOverflow https://stackoverflow.com/questions/7804616

  •  25-10-2019
  •  | 
  •  

質問

ストアがストアポータルにログインしたときとログオンのままでいる時間からデータを記録するテストデータベースがあります。

例:(視覚化のためだけに - 実際のデータベースではありません)

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つのクエリですべてを実行できるかどうか疑問に思いました。できる限り「光」としてプログラム。

そうするために素晴らしい/簡単な方法が必要な場合は、それを共有してください。あなたの貢献はとても感謝しています! :)

役に立ちましたか?

解決

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」値をフィルタリングすると、正しい結果が得られます。少なくともそれは私の教えです。

他のヒント

あなたが追加すると、select newの前に、次のようなものとの接続期間中のlet句が追加されたらどうなりますか

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

そして、Where句を追加します

 where duration != 0

最小値を計算する前に、Where句を含めます。

groupedStores.Where(conn => SqlMethods.DateDiffSecond(conn.Start, conn.End) > 0)
    .Min(conn => (SqlMethods.DateDiffSecond(conn.Start, conn.End))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top