C# 如何将LINQ查询与DataGridView一起使用,但不使用表列的子集?

C# 如何将LINQ查询与DataGridView一起使用,但不使用表列的子集?,c#,linq,datagridview,strongly-typed-dataset,C#,Linq,Datagridview,Strongly Typed Dataset,我试图从一个代码示例中学习,但我显然不了解LINQ的真正工作原理。我想做的是用强类型数据集中表中可用列的子集填充“查找窗口”的DataGridView。我正在尝试以下几点: IEnumerable<DataRow> query = (from t in DataAccess.ds.GL40200.AsEnumerable() where t.SGMTNUMB == 3 select new { t.SGMNT

我试图从一个代码示例中学习,但我显然不了解LINQ的真正工作原理。我想做的是用强类型数据集中表中可用列的子集填充“查找窗口”的DataGridView。我正在尝试以下几点:

IEnumerable<DataRow> query = 
            (from t in DataAccess.ds.GL40200.AsEnumerable()
            where t.SGMTNUMB == 3 
            select new { t.SGMNTID, t.DSCRIPTN });

DataTable myTable = query.CopyToDataTable<DataRow>();

dgv_Exhibitors.DataSource = myTable;

您能用一种简单的方法来填充DataGridView,使其只包含两个所需的列吗?如果有比使用LINQ更好或更简单的方法,我愿意接受建议。

它失败了,因为您的
select
语句正在创建一个包含两个字段的匿名类。它不再是
DataRow
,编译器也不知道如何通过
cast()
将其转换回
DataRow


一种选择是坚持使用有效的方法,然后简单地隐藏您不希望在
DataGridView
中看到的列:

dgv_Exhibitors.DataSource =
    DataAccess.ds.GL40200.AsEnumerable().Where(t => t.SGMTNUMB == 3).CopyToDataTable();

foreach (var col in dgv_Exhibitors.Columns.Cast<DataGridViewColumn>()
                                  .Where(c => c.Name != "SGMNTID" && c.Name != "DSCRIPTN"))
{
    col.Visible = false;
}

扩展Grant Winney的答案,使用而不是
IEnumerable
来接收匿名类型

var query = 
        (from t in DataAccess.ds.GL40200.AsEnumerable()
        where t.SGMTNUMB == 3 
        select new { t.SGMNTID, t.DSCRIPTN });
如果您希望在数据表中显示结果,则必须创建一个并逐个添加值

DataTable myTable = new DataTable();
myTable.Columns.Add("SGMNTID", typeof(int));
myTable.Columns.Add("DSCRIPTN", typeof(string));
foreach (var x in query)
        {
            DataRow dr = myTable.NewRow();
            dr[0] = x.SGMNTID;
            dr[1] = x.DSCRIPTN;
            myTable.Rows.Add(dr);
        }

dgv_Exhibitors.DataSource = myTable;
dgv_Exhibitors.DataSource = (from t in DataAccess.ds.GL40200.AsEnumerable()
                             where t.SGMTNUMB == 3 
                             select new { t.SGMNTID, t.DSCRIPTN }).ToList();
var query = 
        (from t in DataAccess.ds.GL40200.AsEnumerable()
        where t.SGMTNUMB == 3 
        select new { t.SGMNTID, t.DSCRIPTN });
DataTable myTable = new DataTable();
myTable.Columns.Add("SGMNTID", typeof(int));
myTable.Columns.Add("DSCRIPTN", typeof(string));
foreach (var x in query)
        {
            DataRow dr = myTable.NewRow();
            dr[0] = x.SGMNTID;
            dr[1] = x.DSCRIPTN;
            myTable.Rows.Add(dr);
        }

dgv_Exhibitors.DataSource = myTable;