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

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

3 голосов
/ 26 мая 2010

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

Поскольку 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);
}
1 голос
/ 26 мая 2010

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

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

0 голосов
/ 26 мая 2010

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

...