Linq - 如果得到最小值,如果value = 0,则得到下一个值

时间:2011-10-18 08:48:31

标签: sql-server linq min

我有一个测试数据库,用于记录商店登录商店门户时的数据以及保持登录的时间。

实施例: (仅用于可视化目的 - 而非实际数据库)

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查询并且我的偏好保持程序尽可能“轻松”。

如果您需要这么好/简单的方法,请分享。非常感谢您的贡献! :)

3 个答案:

答案 0 :(得分:1)

如果你在select new之前添加了一个let子句用于连接的持续时间,如下所示:

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

然后添加where子句

 where duration != 0

答案 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”值,您将获得正确的结果,至少这是我教过的。

答案 2 :(得分:0)

在计算最小值之前包含where子句。

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