17

我正在使用 LINQ 查询通用字典,然后将结果用作我的 ListView (WebForms) 的数据源。

简化代码:

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

我认为这会起作用,但实际上它会引发System.InvalidOperationException

id 为“myListView”的 ListView 必须具有实现 ICollection 或在 AllowPaging 为 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();

第一个示例中是否有一个小问题可以使它起作用?

(不知道该用什么作为这个问题的标题,请随时编辑为更合适的内容)

4

5 回答 5

29

试试这个:

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

请注意,这实际上是从原始 Values 集合创建一个新列表,因此对字典的任何更改都不会自动反映在绑定控件中。

于 2008-08-28T05:23:15.067 回答
9

我倾向于使用新的 Linq 语法:

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

为什么不使用密钥时会得到字典?你要为这些开销买单。

于 2008-08-28T11:22:22.177 回答
3

你也可以试试:

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

基本上通用集合很难直接转换,所以你真的别无选择,只能创建一个新对象。

于 2008-08-28T06:21:44.880 回答
1
myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo");
于 2008-08-28T05:23:30.807 回答
0

只是在下一句中添加知识并不能从 de db 中恢复任何数据。只需创建查询(因为它是 iqueryable 类型)。要启动此查询,您必须在末尾添加 .ToList() 或 .First()。

dict.Values.Where(rec => rec.Name == "foo")
于 2016-08-08T11:30:34.143 回答