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

最初のクエリは、 (2番目のクエリのように)データ行の列挙可能ではなく、(部門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 fooas最初のLINQステートメント(式まで)の結果は実際には。であるように見えますIEnumerable<long?>

型推論に任せているので、2番目のステートメントは機能します。

于 2010-05-26T08:19:07.470 に答える
0

最初の例では、map.Field>( "Department_id"))を選択しているため、戻り値はIEnumerableではありません。

于 2010-05-26T08:19:12.037 に答える