시퀀스에 요소가 포함되어 있지 않습니까?


131

현재 두 곳에서 단일 쿼리를 사용하여 데이터베이스에서 행을 가져오고 있습니다.

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).Single();

텍스트 상자에 데이터를 넣을 행을 검색 할 때는 쿼리가 문제가되지 않지만 행을 검색하고 편집하기 위해 행을 검색하는 데 사용될 때 "시퀀스에 요소가 없습니다"라는 오류가 반환됩니다. 한 인스턴스에서 적절한 행을 찾을 수 있지만 다른 인스턴스에서는 찾지 못하는 이유를 이해할 수 없습니다.

(ASP.NET MVC 및 LINQ 사용)


18
당신은 어떤 항목을 반환하지 않는 경우가 널 (null)을 반환합니다 SingleOrDefault을 사용해야합니다
마흐무드 Farahat

오류는 dc.BlogPosts에서 ID 값과 일치하는 항목을 찾을 수 없다는 것입니다. ID에 값이 없거나 목록의 항목에 해당 항목이 포함되어 있습니다. SingleOrDefault 또는 FirstOrDefault를 사용하십시오. 오류가 아닌 항목이 없으면 null 개체를 반환합니다.
prd82

답변:


32

두 경우 모두 해당 줄에 중단 점을 두거나 앞에 Debug.Print를 넣고 ID에 포함 된 내용을 확인하십시오.


2
그것을하고 어떤 이유로 든 ID와 날짜가 편집 페이지에서 null \ new (0000-0000)로 전달되고 있음을 알았습니다. 이 페이지는 BlogPost 형식으로되어 있습니다. 편집 페이지에는 제목과 내용에 대한 텍스트 상자 만 있으며 ID와 날짜는 페이지에 전혀 표시되지 않습니다. 이것이 null \ new로 전달하는 이유 일 수 있습니까?

2
신분증의 출처는 어디입니까?
Ryan Lundy

8
뒤에서, 나는 정말로 __ <바보 같은 문제가 확실하지 않다.

367

" LINQ 오류 수정 : 시퀀스에 요소가 없습니다 "에서 :

LINQ 오류 "시퀀스에 요소가 없습니다"가 표시되면 일반적으로 및 대신 First()또는 Single()명령을 사용하기 때문 입니다.FirstOrDefault()SingleOrDefault()

다음 명령으로 인해 발생할 수도 있습니다.

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastAsync()
  • Max()
  • Min()
  • Average()
  • Aggregate()

3
이것은 내 문제를 해결했습니다. 링크 주셔서 감사합니다!
CountMurphy

5
완전한! ctx.Rosters.First(c => c.RosterAccess == accCode);<-부서진 ctx.Rosters.FirstOrDefault(c => c.RosterAccess == accCode);<-일했다
라비 램

2
내 경우에는 나는 Max빈 시퀀스 이상 을하고 있었다
guzart

1
이제 우리는 각각의 최대 투표가 31.25 파운드의 무게를 가짐을 알고 있습니다.
B. Clay Shannon

2
당신은 반드시이 있습니까 LastOrDefault()또한 오류를 트리거 할 수 있습니다? 왜 ? "OrDefault"가 모든 포인트라고 생각했습니다
Robouste

22

사용하십시오

.FirstOrDefault()

결과의 첫 번째 행에 정보가 없으면이 명령어는 기본 정보로 이동하기 때문입니다.


2
비동기 호출의 경우 .FirstOrDefaultAsync ()를 사용하십시오.
Andrea Girardi

12

글쎄, 여기는 무엇 ID입니까? 특히 지역 변수입니까? 일부 범위 / 캡처 문제가 있는데, 이는 쿼리에 대해서만 두 번째 변수 사본을 사용하는 것이 바람직 할 수 있음을 의미합니다.

var id = ID;
BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == id
                 select p).Single();

또한; 이것이 LINQ-to-SQL 인 경우 현재 버전에서는 양식을 사용하면 약간 더 나은 동작을 얻을 수 있습니다.

var id = ID;
BlogPost post = dc.BlogPosts.Single(p => p.BlogPostID == id);

ID는 인수로 전달 된 GUID입니다.

10

문제가 해결됩니다.

var blogPosts = (from p in dc.BlogPosts
             where p.BlogPostID == ID
             select p);
if(blogPosts.Any())
{
  var post = post.Single();
}

8

말한 모든 것 외에도 전화 DefaultIfEmpty()하기 전에 전화 할 수 있습니다 Single(). 이렇게하면 시퀀스에 무언가가 포함되어 InvalidOperationException "시퀀스에 요소가 없습니다"를 방지합니다. 예를 들면 다음과 같습니다.

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).DefaultIfEmpty().Single();

2

평균을 계산하는 함수와 비슷한 상황이있었습니다.

예:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Average();

해결 된 사례 :

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Count == 0 ? 0 : lstMediaValues.Average();

1

오류 이유 :

  1. 쿼리 from p in dc.BlogPosts where p.BlogPostID == ID select p는 시퀀스를 반환합니다.

  2. Single() 1 단계에서 리턴 된 순서에서 요소를 검색하려고합니다.

  3. 예외에 따라 -1 단계에서 리턴 된 순서에는 요소가 없습니다.

  4. Single ()은 1 단계에서 반환 된 시퀀스에서 요소가없는 요소를 검색하려고합니다.

  5. 이후 Single()1 단계에서 반환 된 시퀀스로부터 하나의 요소를 페치 할 수없고, 그 에러가 발생.

고치다:

쿼리를 확인하십시오 (from p in dc.BlogPosts where p.BlogPostID == ID select p)

요소가 하나 이상인 시퀀스를 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.