Linq - как получить минимум, если значение = 0, получить следующее значение - PullRequest
0 голосов
/ 18 октября 2011

У меня есть тестовая база данных, которая регистрирует данные, когда магазин входит на портал магазина и как долго он остается в системе.

Пример: (только для наглядности - не фактическая база данных)

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

Мне нужно получить различные данные из базы данных.Я уже получил максимальную и среднюю продолжительность соединения.(Так что, вероятно, это само собой разумеется ...) Мне также нужно иметь некоторую информацию о том, какая связь длилась меньше всего.Я, конечно, сразу подумал о функции Min () Linq, но, как вы можете видеть, база данных также включает соединения, которые начинались и заканчивались мгновенно.Следовательно, эти данные не являются «действительными» для анализа данных.

Так что мой вопрос в том, как получить минимальное значение, но если значение = 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 ]

1 голос
/ 18 октября 2011

Что если вы добавите перед select new предложение let для продолжительности соединения с чем-то вроде:

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

А затем добавьте предложение where

 where duration != 0
0 голосов
/ 18 октября 2011

Включите предложение where перед вычислением значения Min.

groupedStores.Where(conn => SqlMethods.DateDiffSecond(conn.Start, conn.End) > 0)
    .Min(conn => (SqlMethods.DateDiffSecond(conn.Start, conn.End))
0 голосов
/ 18 октября 2011
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», вы получите правильный результат, по крайней мере, так я учил.

...