1

我想使用匿名类型作为 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 上引发错误。

我怎样才能解决这个问题。请注意,我可能无法更改“数据”的定义,因为这是在应用程序外部控制的。我在这里只是为了清楚起见。

4

3 回答 3

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是 astring所以你需要把它转换成int

2)你需要用来==比较

于 2012-06-07T12:28:04.867 回答
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);

这会对你有帮助吗?

于 2012-06-07T12:24:31.410 回答
1

首先,你想sel成为那个SelectedValue,而不是那个SelectedItem(这样你就可以得到你的子句的id属性)。where您还希望它是一个 int,以便您可以将其与idLINQ 查询中的进行比较:

int sel = int.Parse(ddlEmployee.SelectedValue);

接下来,您可以将您的设置IEnumerabledynamic类型化对象,以避免您提到的编译器错误:

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}
                                };

最后(正如 Caludio 所说),您确实希望==在 LINQ 查询中使用运算符:

var selData = from d in data where d.Id == sel select d;

此时,您DataBind()应该可以正常运行。

于 2012-06-07T13:19:56.100 回答