0

这是行不通的。将 Null 返回到 dept_list。

        var dept_list = ((from map in DtMapGuestDepartment.AsEnumerable()
                         where map.Field<Nullable<long>>("Guest_Id") == 174
                         select map.Field<Nullable<long>>("Department_id")).Distinct())as IEnumerable<DataRow>;
       DataTable dt = dept_list.CopyToDataTable(); //dept_list comes null here

这可以按需要工作。

        var dept_list = from map in DtMapGuestDepartment.AsEnumerable()
                         where map.Field<Nullable<long>>("Guest_Id") == 174
                         select map;
       DataTable dt = dept_list.CopyToDataTable(); //when used like this runs correct.

我在这里犯了什么错误。?

4

3 回答 3

3

您的第一个查询返回一个可枚举的(部门 ID),而不是一个可枚举的数据行(如在第二个查询中)。

由于IEnumerable<Nullable<long>>不是 的子类型IEnumerable<DataRow>,因此as运算符返回 null。

(作为旁注,使用普通演员而不是as会给你一个InvalidCastException,这比仅仅返回更有助于发现错误null。)


编辑:如果你真的需要一个 DataTable 最后,我想你将不得不手动构建它(未经测试):

var dept_list = ((from map in DtMapGuestDepartment.AsEnumerable()
                     where map.Field<Nullable<long>>("Guest_Id") == 174
                     select map.Field<Nullable<long>>("Department_id")).Distinct())

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Department_id", typeof(long?)));
foreach (long? dept in dept_list) {
    dt.Rows.Add(dept);
}
于 2010-05-26T08:18:05.367 回答
1

as IEnumerable<DataRow>可能是演员阵容失败了。如果T不可转换为U,则表达式foo as U将返回null任何T foo。看起来第一个 LINQ 语句(直到as表达式)的结果实际上是一个IEnumerable<long?>.

第二条语句有效,因为您让类型推断为您完成工作。

于 2010-05-26T08:19:07.470 回答
0

在第一个示例中,您选择 map.Field>("Department_id")) 所以它的返回值不是 IEnumerable

于 2010-05-26T08:19:12.037 回答