为什么我从这个声明中得到 Null。 C# 中的查询语法
这不起作用。将 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.
我在这里犯了什么错误。 ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您的第一个查询返回可枚举的值(部门 ID),而不是可枚举的数据行(如第二个查询中所示)。
由于
IEnumerable>
不是IEnumerable
的子类型,因此as
运算符返回 null。(作为旁注,使用普通转换而不是
as
会给你一个InvalidCastException
,它比仅仅返回null
更有助于查找错误。)编辑:如果你真的需要一个 DataTable最后,我想你将不得不手动构建它(未经测试):
Your first query is returning an enumerable of values (of the department IDs) instead of an enumerable of data rows (as in the second query).
Since
IEnumerable<Nullable<long>>
is not a subtype ofIEnumerable<DataRow>
, theas
operator returns null.(As a side note, using a normal cast instead of
as
would have given you anInvalidCastException
, which is more helpful in finding errors than just returningnull
.)EDIT: If you really need a DataTable in the end, I guess you will have to construct it manually (untested):
可能失败的是
as IEnumerable
的转换。如果T
无法转换为U
,则表达式foo as U
将为任何返回
。看起来第一个 LINQ 语句(直到null
T fooas
表达式)的结果实际上是一个IEnumerable
。第二条语句有效,因为您让类型推断为您完成工作。
It's the cast
as IEnumerable<DataRow>
that is probably failing. IfT
is not convertible toU
, then the expressionfoo as U
will returnnull
for anyT foo
. It looks like the result of the first LINQ statement (up to theas
expression) is actually anIEnumerable<long?>
.The second statement works since you're letting type inference do the work for you.
在第一个示例中,您选择 map.Field>("Department_id")) 因此其返回值不是 IEnumerable
in the first example you select map.Field>("Department_id")) so its return value is not IEnumerable