我想使用匿名类型作为GridView的源代码。但它将首先使用下拉列表进行过滤。让我解释一下:我有一个我定义的类型如下:
IEnumerable<object> data = new[]{
new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29},
new{Name="John Jones", Id=2, Sal=12000d, Age=27},
new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21}
. . .
};
我将此作为下拉列表的来源:
ddlEmployee.DataSource=data;
ddlEmployee.DataTextField = "Name";
ddlEmployee.DataValueField = "Id";
ddlEmployee.DataBind();
当用户从列表中选择一个项目时,我想获取相应的对象并将其绑定在Gridview中:
var sel = ddlEmployee.SelectedItem.ToString();
var selData = from d in data where **d.Id= sel** select d;
gvSearchResults.DataSource = selData;
gvSearchResults.DataBind();
但问题是因为我将d作为一个对象,它会在d.Id上抛出一个错误。
我该如何解决这个问题。请注意,我可能无法更改“数据”的定义,因为这是在应用程序之外进行控制的。我只是为了清楚起见而在这里展示。
答案 0 :(得分:3)
您的问题是您正在使用Enumerable<object>
。当您执行LINQ查询时,它会说Id
不属于object
试试这个
var data = new[]{
new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29},
new{Name="John Jones", Id=2, Sal=12000d, Age=27},
new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21}
. . .
};
另外,我不知道d.Id= sel
是否是你所拥有的(*
除外)。如果是这种情况,你需要改变一些事情
1)sel
是string
,因此您需要将其转换为int
2)您需要使用==
进行比较
答案 1 :(得分:1)
您可以使用“动态”数据类型,因此这样的工作原理:
dynamic data = new[]{
new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29},
new{Name="John Jones", Id=2, Sal=12000d, Age=27},
new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21}
};
Console.WriteLine(data[0].Name);
这对你有帮助吗?
答案 2 :(得分:1)
首先,您希望sel
成为SelectedValue
,而不是SelectedItem
(以便获得id
子句的where
属性。您还希望它是一个int,以便您可以将它与LINQ查询中的id
进行比较:
int sel = int.Parse(ddlEmployee.SelectedValue);
接下来,您可以将IEnumerable
设置为dynamic
类型的对象,以避免您提到的编译器错误:
IEnumerable<dynamic> data = new[]{
new{Name="McClure Wallace", Id=1, Sal=10000d, Age=29},
new{Name="John Jones", Id=2, Sal=12000d, Age=27},
new{Name="Gloria Flowhart", Id=3,Sal=14000d, Age=21}
};
最后(as Caludio said),您确实想在LINQ查询中使用==
运算符:
var selData = from d in data where d.Id == sel select d;
此时,您的DataBind()
应该没有任何问题。