2012-11-25 3 views
8

나는이 질문에 대해 여러 가지 변종을 보았지만 아무 대답도 나와 맞지 않습니다.EF Linq 제품 레코드가 반환되지 않을 때의 합계

public double Total 

    { 
     get 
     { 
      return _Context.Sales.Where(t => t.Quantity > 0) 
       .DefaultIfEmpty() 
       .Sum(t => t.Quantity * t.Price);     
     } 
    } 

를 행이 I는 0을 반환 할 반환되지 않습니다 경우 등은 아래 제품의 합으로 더 복잡한 아무것도 - 그들 대부분은 너무 하나의 열 합계를 시도하고있다. 그러나 행이 반환되지 않으면 .Sum()이 실패합니다. Convert.ToDouble을 삽입하고 null 병합 연산자를 사용하는 여러 가지 옵션이 있지만 여전히 모든 오류가 발생했습니다.

나는 이것을 할 수있는 간단한 방법이 없다고 확신한다 - 구글 벽돌 벽에 머리를 너무 세게 치면 도움이된다!

답변

13

DefaultIfEmpty() 연산자를 삭제하십시오. Sum을 null 가능 유형으로 캐스트하십시오. @lazyberezovsky

SELECT SUM([Filter1].[A1]) FROM 
(SELECT CAST(CAST([Extent1].[Quantity] AS decimal(19,0)) * 
        [Extent1].[Price] AS float) AS [A1] 
FROM [dbo].[Sales] AS [Extent1] 
WHERE [Extent1].[Quantity] > 0) AS Filter1 
+0

감사 : 쿼리가 SQL이 모양을 생성

public double Total { get { return _Context.Sales .Where(t => t.Quantity > 0) .Sum(t => (double?)(t.Quantity * t.Price)) ?? 0; } } 

null을 반환하는 경우 다음 기본 값을 반환 널 병합 연산자를 사용합니다. 그것을 시도했다 - 컴파일러 오류를 수신 : 연산자 '?? 'double'및 'int'유형의 피연산자에는 적용 할 수 없습니다. 하지만 이것은 정확히 내가 습득하려고하는 것입니다 ... – user1622713

+0

@ user1622713 nullable 형식으로 캐스팅하면 도움이 될 것입니다 –

+0

@lazyberezovsky는 시퀀스가 ​​비어 있으면 '합계'가 아닌 'null'을 반환하지 않습니다? –