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

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

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

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

(ASP.NET MVC 및 LINQ 사용)



답변

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


답변

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

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

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

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

답변

사용하십시오

.FirstOrDefault()

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


답변

글쎄, 여기는 무엇 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);


답변

문제가 해결됩니다.

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


답변

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

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


답변

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

예:

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

해결 된 사례 :

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