시퀀스에 일치하는 요소가 없습니다.
데이터 조작을 위해 linq를 사용하는 asp.net 응용 프로그램이 있습니다. 실행하는 동안 "시퀀스에 일치하는 요소가 없습니다"라는 예외가 발생합니다.
if (_lstAcl.Documents.Count > 0)
{
for (i = 0; i <= _lstAcl.Documents.Count - 1; i++)
{
string id = _lstAcl.Documents[i].ID.ToString();
var documentRow = _dsACL.Documents.First(o => o.ID == id);
if (documentRow !=null)
{
_lstAcl.Documents[i].Read = documentRow.Read;
_lstAcl.Documents[i].ReadRule = documentRow.ReadRule;
_lstAcl.Documents[i].Create= documentRow.Create;
_lstAcl.Documents[i].CreateRule = documentRow.CreateRule;
_lstAcl.Documents[i].Update = documentRow.Update;
_lstAcl.Documents[i].UpdateRule = documentRow.UpdateRule;
_lstAcl.Documents[i].Delete = documentRow.Delete;
_lstAcl.Documents[i].DeleteRule = documentRow.DeleteRule;
}
}
}
글쎄요, 예외를 던지는 줄은 다음과 같습니다.
var documentRow = _dsACL.Documents.First(o => o.ID == id)
First()
일치하는 요소를 찾을 수 없으면 예외가 발생합니다. 나중에 null을 테스트한다는 점을 감안할 때 원하는 것처럼 들리며 FirstOrDefault()
일치하는 항목이 없으면 요소 유형의 기본값 (참조 유형의 경우 null)을 반환합니다.
var documentRow = _dsACL.Documents.FirstOrDefault(o => o.ID == id)
일부 상황에서 고려해야 할 다른 옵션은 Single()
(정확히 하나의 일치 요소가 SingleOrDefault()
있다고 생각할 때 ) 및 (정확히 일치하는 요소가 하나 또는 0이라고 생각할 때)입니다. FirstOrDefault
이 특별한 경우에 이것이 최선의 선택 이라고 생각 하지만 어쨌든 다른 사람들에 대해 아는 것은 가치가 있습니다.
반면에, 처음에는 여기에 조인을하는 것이 더 나을 것 같습니다. 첫 번째가 아닌 모든 일치를 수행하는 것에 관심이 없다면 다음을 사용할 수 있습니다.
var query = from target in _lstAcl.Documents
join source in _dsAcl.Document
where source.ID.ToString() equals target.ID
select new { source, target };
foreach (var pair in query)
{
target.Read = source.Read;
target.ReadRule = source.ReadRule;
// etc
}
더 간단 하고 효율적인 IMO입니다.
당신이 경우에도 않는 루프를 유지하기로 결정, 나는 몇 가지 제안이 있습니다
- 바깥 쪽을 제거하십시오
if
. Count가 0 인 것처럼 for 루프 본문이 실행되지 않으므로 필요하지 않습니다. for 루프에서 배타적 상한을 사용하십시오. C #에서는 더 관용적입니다.
for (i = 0; i < _lstAcl.Documents.Count; i++)
일반적인 하위 표현식 제거 :
var target = _lstAcl.Documents[i]; // Now use target for the rest of the loop body
가능한 경우 다음 으로 시작 하는
foreach
대신 사용for
:foreach (var target in _lstAcl.Documents)
FirstOrDefault를 사용하십시오 . 먼저 null을 반환하지 않습니다. 일치하는 요소를 찾을 수없는 경우보고있는 예외가 발생합니다.
_dsACL.Documents.FirstOrDefault(o => o.ID == id);
MSDN 라이브러리에서 : Source에 요소가 없으면 First (IEnumerable) 메서드에서 예외가 발생합니다. 소스 시퀀스가 비어있을 때 대신 기본값을 반환하려면 FirstOrDefault 메서드를 사용하십시오.
상황에 맞는 메뉴를 통해 컨트롤러를 만드는 동안이 문제에 직면 한 사용자를 위해 Visual Studio를 관리자로 다시 열면 문제가 해결되었습니다.
Maybe using Where() before First() can help you, as my problem has been solved in this case.
var documentRow = _dsACL.Documents.Where(o => o.ID == id).FirstOrDefault();
참고URL : https://stackoverflow.com/questions/3994336/sequence-contains-no-matching-element
'Programming' 카테고리의 다른 글
Flutter 프로젝트의 lint-gradle-api-26.1.2.jar을 찾을 수 없습니다. (0) | 2020.08.18 |
---|---|
자유 함수가 예상되는 멤버 함수를 어떻게 전달할 수 있습니까? (0) | 2020.08.18 |
Django-DB-Migrations : 보류중인 트리거 이벤트가 있으므로 ALTER TABLE을 사용할 수 없습니다. (0) | 2020.08.18 |
Active Directory에서 사용자 목록을 얻으려면 어떻게해야합니까? (0) | 2020.08.18 |
Arrays.asList (array)와 새로운 ArrayList의 차이점 (0) | 2020.08.18 |