2011-10-18 2 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 쿼리 지금까지 (최소() 함수를 구현하는) :

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 쿼리가 반환 될 것으로 기대하고 내 선호도가 프로그램을 가능한 한 "빛"으로 유지하기 때문에 모든 쿼리를 한 번만 수행하는 것이 가능합니다.

위대한/간단한 방법으로 해결하려면 공유해야합니다. 귀하의 기부금은 매우 높이 평가됩니다! :)

답변

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

당신이 같은으로 conection에의 기간 동안 선택의 새로운하는 let 절하기 전에 추가하는 경우 : 절

where duration != 0 
+0

이것도 작동합니다. :) 나는 심지어 거기에 clausule이 있다는 것을 몰랐습니다. 롤). 그러나, 나는 @ Frederiek의 솔루션 (코드가 적다)과 함께 갈 것이라고 생각하지만, 생각하고 입력 해 주셔서 감사합니다! – doc92

+0

let 절을 사용하면 값이 한 번만 계산된다는 장점이 있습니다. 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

나는이 하나를 시도했지만 오류가 발생하는 것 같습니다 ('int'를 'bool'으로 암시 적으로 변환 할 수는 없습니까?)? – doc92