values framework empty linq dynamic datatable expression dynamic-linq

framework - is null linq



LINQ Dynamic Expression API, predicado con DBNull.Value comparison (6)

Tengo un problema al utilizar la API Dynamic Expression. Parece que no puedo comparar un campo DataTable con DBNull.Value. Se supone que la API es capaz de "admitir el acceso de propiedades estáticas de campo o estáticas. Se puede acceder a cualquier campo público o propiedad". Sin embargo, dada la siguiente consulta:

var whatever = table1.AsEnumerable() .Join(table2.AsEnumerable(), (x) => x.Field<int>("Table1_ID"), (y) => y.Field<int>("Table2_ID"), (x, y) => new { x, y}) .AsQueryable() .Where("x[/"NullableIntColumnName/"] == DBNull.Value");

Termino recibiendo el error: "No existe ninguna propiedad o campo ''DBNull'' en el tipo ''<> f__AnonymousType0`2''"

¿Alguien tiene ideas sobre cómo solucionar esto? No puedo usar Submission.Field ("NullableIntColumnName") en la cadena pasada al método Where, por cierto, o podría comparar con null en lugar de DBNull.Value.


¿Qué sucede cuando reemplazas tu actual. Donde hay algo así como

.Where(string.format("x[/"NullableIntColumnName/"] == {0}",DBNull.Value));


. Where (a => a.IntColName == null);

Editar:

Lo siento, no vi este requisito dinámico ... Dinámico sería: (al menos en el Marco 4)

var intColName = "..."; .Where(string.Format("it.{0} is null", intColName));


Bueno, finalmente lo tengo. cptScarlet casi lo tenía.

var values = new object[] { DBNull.Value }; ... .Where("x[/"NullableIntColumnName/"] == @0", values);

o

.Where("x[/"NullableIntColumnName/"] == @0", DBNull.Value);


En general, también puedes probar:

.Where("NullableColumnName.HasValue");


Perdón por no responder con una USL pero ...

¿Has buscado en la fuente? No hay mucho. Supongo que DBNull no está en la lista de objetos raíz registrados.

No tengo la fuente a mano en este momento, pero también es probable que te diga con qué otras constantes se podría comparar.


Si cambia x.Field<int>("Table1_ID") a x.Field<int?>("Table1_ID") , obtendrá enteros nulables en lugar de enteros regulares, y cualquier valor DBNull se convertirá en simple C # null valores. Basado simplemente en su fragmento de código, ni siquiera estoy seguro de que necesite expresiones dinámicas, un simple. .Where(foo => foo.x == null) debería funcionar.