2016-06-16 5 views
1

도와주세요. LinQ 쿼리에 많은 필터 조건이 있습니다.LinQ 집계 오류 - 시퀀스에 요소가 없습니다.

아래는 내 쿼리입니다 :

Error Message : Sequence contains no elements 
Stack Trace : at System.Linq.Enumerable.Aggregate[TSource](IEnumerable`1 source, Func`3 func) 

내가 LINQ에 새로운 오전 : 어떤 경우에는

var Aggregate = linqkb.Where(s => s.Status.Equals("Approved")).Select(s => s.Approver) 
    .Distinct() 
    .Aggregate((i, j) => i + ";" + j) 
    .Split(';') 
    .Distinct(); 

, 나는 오류를 얻고있다. 제발 제안 해주세요. 아래 그림과 같이

내가 봤 및 Aggregator 전에 **.DefaultIfEmpty()**를 사용하여 시도했다 :

var Aggregate = linqkb.Where(s => s.Status.Equals("Approved")).Select(s => s.Approver) 
    .Distinct() 
    .DefaultIfEmpty() 
    .Aggregate((i, j) => i + ";" + j) 
    .Split(';') 
    .Distinct(); 

하지만이 나던 작품.

제안 사항?

+0

이 순서의 요소는 어떤 타입 : 당신은 당신이 사용해야을 추출하고 별개의 목록을 얻으려면? –

+0

호출을 분할하고 중간 결과를 디버그 할 수 있습니다. 아마도'Status = "Approved"라는 요소가 없을 수도 있습니다. 'DefaultIfEmpty'는 또 다른 빈 시퀀스 afaik만을 제공합니다. –

+2

왜 당신은'';''으로 접속하여 다음 줄에서 다시 분리합니까? 예외에 대한 가장 간단한 수정은 'Aggregate'즉 Aggregate ("", (i, j) => i + ";"+ j) "에 초기 값을 제공하는 것입니다. – Lee

답변

5

은 어큐뮬레이터로 시퀀스의 첫 번째 항목을 사용한다. 시퀀스에 항목이 없으면 예외가 throw되므로이 작업을 수행 할 수 없습니다. 당신은 명시 적으로 초기 값 즉, 문자열을 결합이 방법은 비효율적이고 중간 쓰레기를 많이 생성하는

.Aggregate(string.Empty, (i, j) => i + ";" + j) 

가주의를 제공 할 수 있습니다. string.Join을 사용할 수 있습니다. 이유는 다음 행에서 ";"의 결과를 즉시 분리 한 이유가 명확하지 않은 경우입니다. 다음과 같은 문제에 대한

+0

이것은 나를 위해 일했습니다, 감사합니다 리! – user2598808

1

오류는 요소가 없다는 것입니다. linqkb.Where(s => s.Status.Equals("Approved"))은 빈 세트를 리턴합니다. 집계는 그 위에 실행할 수 없습니다. 수표로 Any()을 사용할 수 있습니다. 또한 ';'와 결합하여 나중에 Distinct을 수행하는 것은 실제로 아무 것도하지 않습니다. 아무것도 설치되지 않은 경우

var Aggregate = linqkb.Where(s => s.Status.Equals("Approved"))                    .Select(s => s.Approver) 
    .Distinct(); 

if (!Aggreate.Any()) 
return ...; 
Aggregate
1

직접 솔루션입니다 :

var Aggregate = linqkb 
    .Where(s => s.Status.Equals("Approved")) 
    .Select(s => s.Approver) 
    .Distinct() 
    .Aggregate(string.Empty, (i, j) => i + ";" + j) 
    .Split(';') 
    .Distinct(); 

즉 당신이 씨 매개 변수로 집계의 과부하를 사용해야합니다.

그러나 귀하의 검색어는 매우 유선처럼 보입니다. 그냥 승인자 필드의 고유 한 값을 원하는 경우 경우는 구조 다음 사용하는 것이 충분하다 :

승인자 필드로 구분 된 값이 포함 된 경우 경우
var Aggregate = linqkb 
    .Where(s => s.Status.Equals("Approved")) 
    .Select(s => s.Approver) 
    .Distinct(); 

";"

는`linqkb` 무엇
var Aggregate = linqkb 
    .Where(s => s.Status.Equals("Approved")) 
    .SelectMany(s => s.Approver.Split(";")) 
    .Distinct(); 
관련 문제