如何在 LINQ 中使用 WHERE

本文关键字:WHERE LINQ | 更新日期: 2023-09-27 18:34:08

我正在尝试这个但没有成功

var v=ds.Table[0].AsEnumerable().Where<DataRow>(r=>r.Field<int>("productID")==23);
GridView1.DataSource=v;
GridView1.DataBind();

网格视图仅显示一行标题 RowError HasRrror 但我期待一行包含产品信息。

如何在 LINQ 中使用 WHERE

我认为您应该尝试使用CopyToDataTable

ds.Table[0].AsEnumerable().Where<DataRow>(r=>r.Field<int>("productID")==23).CopyToDataTable();

当您将其转换为可枚举时,过滤列表没有标识符,例如ProductID因此网格将无法映射列并失败。

或者,您也可以选择使用 AsDataView() 而不是 CopyToDataTable()

可以找到更详细的说明 绑定数据行

数据绑定由 ListBindingHelper 和 TypeDescriptor 控制 类。 绑定到列表时, 调用 ListBindingHelper.GetListItemProperties 方法以获取 列表中的列。 如果列表实现了 ITypedList 接口, 调用其 GetItemProperties 方法。 否则,它将使用 类型描述符,以获取列表中第一项的属性。 (这使用反射(

DataView 类(DataTable 也通过该类进行绑定,使用 IListSource(实现ITypedList并返回 数据列属性描述符,用于公开表中的列。 这就是您可以绑定到数据视图或数据表并查看列的原因。 但是,当您绑定到列表时,没有 ITypedList 可以将列作为属性返回。 因此,它回退 反射并显示 DataRow 类的物理属性。

试试这个。

var results = from myRow in ds.Table[0].Rows 
              where myRow.Field<int>("productID") == 23
              select myRow;

这应该为您提供所需的行。