将LINQ查询绑定到DataGridView

Dan*_*ard 10 linq data-binding datagridview linq-to-dataset linq-to-sql

这非常令人困惑,我使用AsDataView将查询结果绑定到dgv,它可以正常使用以下内容:

var query = from c in myDatabaseDataSet.Diamond where c.p_Id == p_Id select c;
dataGridView1.DataSource = query.AsDataView();
Run Code Online (Sandbox Code Playgroud)

但是,这会导致错误:

var query = from item in myDatabaseDataSet.Items
    where item.p_Id == p_Id
    join diamond in myDatabaseDataSet.Diamond
        on item.p_Id equals diamond.p_Id
    join category in myDatabaseDataSet.DiamondCategory
        on diamond.dc_Id equals category.dc_Id
    select new
    {
        Product = item.p_Name,
        Weight = diamond.d_Weight,
        Category = category.dc_Name
    };

    dataGridView1.DataSource = query.AsDataView();
Run Code Online (Sandbox Code Playgroud)

错误:

Instance argument: cannot convert from
'System.Collections.Generic.IEnumerable<AnonymousType#1>' to 
'System.Data.DataTable'
Run Code Online (Sandbox Code Playgroud)

AsDataView不会出现在查询中.(列表).为什么会这样?如何将上面的查询绑定到dgv呢?

cas*_*One 4

AsDataView的签名如下:

public static DataView AsDataView(
    this DataTable table
)
Run Code Online (Sandbox Code Playgroud)

唯一的参数是DataTable

您的查询返回匿名类型的IEnumerable,该类型没有隐式转换为 DataTable(或DataRow实例序列,在这种情况下您可以使用它来帮助您创建 DataTable)。

您需要将结果返回到 DataTable 或可以转换为 DataTable 的内容,然后它才能工作。

在您的特定情况下,您似乎正在(或正在)使用类型化 DataSets。如果是这种情况,那么您应该能够获取所选的值,然后创建新的类型化 DataRow 实例(应该有适合您的工厂方法),然后将其放入类型化 DataTable 中,可以在该实例上调用 AsDataView 。