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

简化代码:

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

我以为这会起作用,但实际上它会抛出一个 系统无效操作异常:

ID 为“myListView”的 ListView 必须 具有 实现 ICollection 或可以执行 数据源分页(如果 AllowPaging 为 真。

为了让它工作,我不得不采取以下措施:

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 集合创建一个新列表,因此对字典的任何更改都不会自动反映在绑定控件中。

其他提示

我倾向于使用新的 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");

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

dict.Values.Where(rec => rec.Name == "foo")
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top