소스 컬렉션이 비어있는 동안 LINQ Sum ()이 0을 반환하도록하는 방법
기본적으로 다음 쿼리를 수행 할 때 일치하는 리드가 없으면 다음 쿼리에서 예외가 발생합니다. 이 경우 예외가 발생하는 대신 합계를 0으로 설정하는 것이 좋습니다. 이것이 쿼리 자체에서 가능 query.Any()
할까요? 쿼리를 저장하고 확인하는 것이 아니라 의미 합니까?
double earnings = db.Leads.Where(l => l.Date.Day == date.Day
&& l.Date.Month == date.Month
&& l.Date.Year == date.Year
&& l.Property.Type == ProtectedPropertyType.Password
&& l.Property.PropertyId == PropertyId).Sum(l => l.Amount);
다음과 같이 쿼리를 변경하십시오.
db.Leads.Where(l => l.Date.Day == date.Day
&& l.Date.Month == date.Month
&& l.Date.Year == date.Year
&& l.Property.Type == ProtectedPropertyType.Password
&& l.Property.PropertyId == PropertyId)
.Select(l => l.Amount)
.DefaultIfEmpty(0)
.Sum();
이런 식으로 쿼리는 Amount
필드 만 선택합니다 . 컬렉션이 비어 있으면 값이 1 인 요소를 반환 한 0
다음 합계가 적용됩니다.
다른 핵을 사용하는 것을 선호합니다.
double earnings = db.Leads.Where(l => l.Date.Day == date.Day
&& l.Date.Month == date.Month
&& l.Date.Year == date.Year
&& l.Property.Type == ProtectedPropertyType.Password
&& l.Property.PropertyId == PropertyId)
.Sum(l => (double?) l.Amount) ?? 0;
대신 이것을 시도하십시오, 더 짧습니다 :
db.Leads.Where(..).Aggregate(0, (i, lead) => i + lead.Amount);
그것은 나를 위해 이겼다 :
int Total = 0;
Total = (int)Db.Logins.Where(L => L.id == item.MyId).Sum(L => (int?)L.NumberOfLogins ?? 0);
내 LOGIN 테이블의 NUMBEROFLOGINS 필드에서 일부 값은 NULL이고 다른 값은 INT 번호입니다. 한 회사의 모든 사용자 (각 ID)의 총 NUMBEROFLOGINS를 합산합니다.
db.Leads.Where(l => l.Date.Day == date.Day
&& l.Date.Month == date.Month
&& l.Date.Year == date.Year
&& l.Property.Type == ProtectedPropertyType.Password
&& l.Property.PropertyId == PropertyId)
.Select(l => l.Amount)
.ToList()
.Sum();
업데이트 : 작동하는 솔루션이지만 이 답변은 올바르지 않습니다 . 올바른 것은 Simon Belanger가 제공 한 것입니다. 그럼에도 불구하고 삭제하는 대신 여기를 보충 정보로 남겨 둡니다 (주석 참조).
여기서 흥미로운 세부 사항은 LINQ To SQL 구현Sum
(사용중인 것) 이 LINQ To Objects와 다릅니다. Simon Belanger의 대답은 정확하고 마음에 들지만 (원거리 검색하지는 않음)이 작업을 수행하는 또 다른 옵션은 소스의 컴파일 유형과 LINQ To Objects 사용법을 변경하는 것입니다. 다른 작업 Sum
이 수행됩니다 (추가 작업 필요 없음).
db.Leads.Where(...)
.AsEnumerable() // switch to LINQ to Objects
.Sum(l => l.Amount);
에서 MSDN :
AsEnumerable (IEnumerable) 메소드는 소스의 컴파일 타임 유형을 IEnumerable을 구현하는 유형에서 IEnumerable 자체로 변경하는 것 외에 다른 효과는 없습니다.
'programing' 카테고리의 다른 글
CSS를 사용하여 절대 div를 가로로 가운데에 배치하는 방법은 무엇입니까? (0) | 2020.05.25 |
---|---|
숭고한 텍스트 3, 공백을 탭으로 변환 (0) | 2020.05.25 |
내 열거 형에 친숙한 이름을 지정할 수 있습니까? (0) | 2020.05.25 |
xcode에서 iOS 앱 아카이브를 생성 할 수 없습니다 (0) | 2020.05.25 |
C ++에서 열거 형을 플래그로 사용하는 방법은 무엇입니까? (0) | 2020.05.25 |