Почему я получаю 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