Pregunta

Esto no está funcionando. devuelve Null a 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

Esto funciona de la deseada.

        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.

¿Qué error se está haciendo por mí aquí. ?

¿Fue útil?

Solución

Su primera consulta devuelve un enumerable de Los valores (de los ID de departamento) en lugar de un enumerable de filas de datos (como en la segunda consulta).

Desde IEnumerable<Nullable<long>> no es un subtipo de IEnumerable<DataRow>, la rentabilidad del operador as nulo.

(Como nota lateral, usando un molde normal en lugar de as te habría dado un InvalidCastException, que es más útil para encontrar errores que acaban de volver null.)


EDIT: Si realmente necesita un DataTable al final, supongo que tendrá que construir de forma manual (no probado):

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);
}

Otros consejos

Es la as IEnumerable<DataRow> elenco que probablemente está fallando. Si T no se puede convertir en U, entonces la expresión foo as U volverá null para cualquier T foo. Parece que el resultado de la instrucción primera LINQ (hasta la expresión as) es en realidad un IEnumerable<long?>.

La segunda declaración funciona ya que eres el tipo de arrendamiento inferencia hace el trabajo por usted.

en el primer ejemplo se selecciona map.Field> ( "department_id")) por lo que su valor de retorno no es IEnumerable

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top