현재 두 곳에서 단일 쿼리를 사용하여 데이터베이스에서 행을 가져오고 있습니다.
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();