这非常令人困惑,我使用AsDataView将查询结果绑定到dgv,它可以正常使用以下内容:
var query = from c in myDatabaseDataSet.Diamond where c.p_Id == p_Id select c;
dataGridView1.DataSource = query.AsDataView();
但是,这会导致错误:
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();
错误:
Instance argument: cannot convert from
'System.Collections.Generic.IEnumerable<AnonymousType#1>' to
'System.Data.DataTable'
AsDataView不会出现在查询中。(列表)。为什么会这样?如何将上面的查询绑定到dgv呢?。
答案 0 :(得分:4)
AsDataView的签名如下:
public static DataView AsDataView(
this DataTable table
)
唯一的参数是DataTable。
您的查询返回一个匿名类型的IEnumerable,该类型没有隐式转换为DataTable(或DataRow个实例序列,在这种情况下您可以使用它帮助您创建DataTable。)
您需要将结果返回到DataTable中,或者将其转换为DataTable然后它才能正常工作。
在您的特定情况下,您似乎(或正在)使用typed DataSets。如果是这种情况,那么您应该能够获取所选的值,然后创建新的类型DataRow实例(应该有工厂方法),然后可以将其放入类型化的DataTable中,可以调用AsDataView
答案 1 :(得分:1)
只需将结果转换为列表并将其绑定到网格即可。
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
}.ToList();
dataGridView1.DataSource = query;