这不起作用。将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.
我在这里犯了什么错误。 ?
答案 0 :(得分:3)
您的第一个查询是返回可枚举的值(部门ID),而不是可枚举的数据行(如第二个查询中所示)。
由于IEnumerable<Nullable<long>>
不是IEnumerable<DataRow>
的子类型,as
运算符返回null。
(作为旁注,using a normal cast instead of 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);
}
答案 1 :(得分:1)
这可能是失败的演员as IEnumerable<DataRow>
。如果T
无法转换为U
,则表达式foo as U
将为null
返回T foo
。看起来第一个LINQ语句(直到as
表达式)的结果实际上是IEnumerable<long?>
。
第二个陈述有效,因为你让类型推断为你工作。
答案 2 :(得分:0)
在第一个例子中你选择map.Field&gt;(“Department_id”))所以它的返回值不是IEnumerable