Почему я получаю Null из этого заявления. Синтаксис запроса в C#

Это не работает. Возвращает ноль в список 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 ответа

Решение

Ваш первый запрос возвращает перечисляемые значения (из идентификаторов отделов) вместо перечисляемых строк данных (как во втором запросе).

поскольку IEnumerable<Nullable<long>> не является подтипом IEnumerable<DataRow>, as Оператор возвращает ноль.

(Как примечание стороны, используя нормальное приведение вместо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);
}

Это актерский состав as IEnumerable<DataRow> это, вероятно, терпит неудачу. Если T не конвертируется в Uтогда выражение foo as U вернусь null для любого T foo, Это выглядит как результат первого оператора LINQ (до as выражение) на самом деле IEnumerable<long?>,

Второе утверждение работает, так как вы позволяете выводу типов делать всю работу за вас.

В первом примере вы выбираете map.Field>("Department_id")), поэтому его возвращаемое значение не IEnumerable

Другие вопросы по тегам