문제

LINQ를 사용하여 일반 사전을 쿼리 한 다음 결과를 ListView (WebForms)의 DataSource로 사용합니다.

단순화 된 코드 :

Dictionary<Guid, Record> dict = GetAllRecords();
myListView.DataSource = dict.Values.Where(rec => rec.Name == "foo");
myListView.DataBind();

나는 그것이 효과가 있다고 생각했지만 실제로 그것은 System.InvalidOperationException:

ID 'MyListView'가 포함 된 ListView에는 ICOLLECTION을 구현하거나 허용 페이징이 참이면 데이터 소스 페이징을 수행 할 수있는 데이터 소스가 있어야합니다.

작동하기 위해서는 다음에 의지해야했습니다.

Dictionary<Guid, Record> dict = GetAllRecords();
List<Record> searchResults = new List<Record>();

var matches = dict.Values.Where(rec => rec.Name == "foo");
foreach (Record rec in matches)
    searchResults.Add(rec);

myListView.DataSource = searchResults;
myListView.DataBind();

첫 번째 예에 작용할 수있는 작은 gotcha가 있습니까?

(이 질문 제목으로 무엇을 사용해야하는지 잘 모르겠습니다. 더 적절한 것으로 편집하십시오)

도움이 되었습니까?

해결책

이 시도:

var matches = dict.Values.Where(rec => rec.Name == "foo").ToList();

원래 값 컬렉션에서 본질적으로 새 목록을 작성하므로 사전에 대한 변경 사항은 자동으로 바운드 컨트롤에 반영되지 않습니다.

다른 팁

새로운 LINQ 구문을 선호하는 경향이 있습니다.

myListView.DataSource = (
    from rec in GetAllRecords().Values
    where rec.Name == "foo"
    select rec ).ToList();
myListView.DataBind();

키를 사용하지 않을 때 왜 사전을 받고 있습니까? 당신은 그 간접비를 지불하고 있습니다.

당신은 또한 시도 할 수도 있습니다 :

var matches = new List<Record>(dict.Values.Where(rec => rec.Name == "foo"));

기본적으로 일반 컬렉션은 직접 캐스팅하기가 매우 어렵 기 때문에 선택은 거의 없지만 새 객체를 만들 수 있습니다.

myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo");

지식을 추가하는 것만으로 다음 문장은 DE DB에서 데이터를 복구하지 않습니다. 쿼리 만 작성합니다 (IT는 Iqueryable 유형 임). 이 쿼리를 시작하려면 마지막에 .tolist () 또는 .first ()를 추가해야합니다.

dict.Values.Where(rec => rec.Name == "foo")
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top