Я использую LINQ для запроса общего словаря, а затем использую результат в качестве источника данных для моего ListView (WebForms).
Упрощенный код:
Dictionary<Guid, Record> dict = GetAllRecords();
myListView.DataSource = dict.Values.Where(rec => rec.Name == "foo");
myListView.DataBind();
Я думал, что это сработает, но на самом деле он выдает System.InvalidOperationException:
ListView with id 'myListView' must have a data source that either implements ICollection or can perform data source paging if AllowPaging is true.
Чтобы заставить его работать, мне пришлось прибегнуть к следующему:
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();
Есть ли небольшая ошибка в первом примере, чтобы заставить его работать?
(Не был уверен, что использовать в качестве заголовка вопроса для этого, не стесняйтесь редактировать на что-то более подходящее)





Попробуй это:
var matches = dict.Values.Where(rec => rec.Name == "foo").ToList();
Имейте в виду, что по сути это будет создание нового списка из исходной коллекции Values, и поэтому любые изменения в вашем словаре не будут автоматически отражены в вашем связанном элементе управления.
myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo");
1[Record]' to type 'System.Collections.Generic.List1 [Запись] '.Вы также можете попробовать:
var matches = new List<Record>(dict.Values.Where(rec => rec.Name == "foo"));
Обычно общие коллекции очень сложно преобразовать напрямую, поэтому у вас действительно мало выбора, кроме как создать новый объект.
Я предпочитаю использовать новый синтаксис Linq:
myListView.DataSource = (
from rec in GetAllRecords().Values
where rec.Name == "foo"
select rec ).ToList();
myListView.DataBind();
Почему вы получаете словарь, когда не пользуетесь ключом? Вы платите за эти накладные расходы.
Просто добавив знания, следующее предложение не восстановит никаких данных из de db. Просто создайте запрос (для этого это тип iqueryable). Для запуска этого запроса необходимо в конце добавить .ToList () или .First ().
dict.Values.Where(rec => rec.Name == "foo")
Это обратное stackoverflow.com/questions/472669/…