linq-値= 0の場合、最小値を取得するには、次の値を取得します
-
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))