为什么我从这个声明中得到Null。 C#中的查询语法

时间:2010-05-26 08:13:53

标签: c# linq linq-to-dataset linq-query-syntax

这不起作用。将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.

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

3 个答案:

答案 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