Cosmos DB IQueryable en campos nulos.
Tengo este campo en mi modelo:
public class Lead {
....
public Guid? ClientId { get; set; }
}
Cuando intento filtrar en este campo usando IQueryable
en el código de esta manera:
var queryable = container.GetItemLinqQueryable<Lead>()
.OrderBy(l => l.Created)
.AsQueryable();
....
//Use a list of GUIDs to filter on
if (search.ClientId?.Any() == true)
{
queryable = queryable.Where(lead => lead.ClientId.HasValue && search.ClientId.Contains(lead.ClientId.Value));
}
return queryable;
Espero que se agregue la siguiente cláusula WHERE
cuando se traduce a SQL:
WHERE IS_DEFINED(c.clientId) AND c.clientId IN ('some GUID', 'another GUID', 'and so on')
En la práctica, esta instrucción LINQ se convierte en esto:
SELECT VALUE root FROM root WHERE (root['clientId']['hasValue'] AND (root['clientId']['value'] IN ('e870a235-ccb0-4a78-81b3-05dce5ac8a7f'))) ORDER BY root['created'] ASC
Cuando ejecuto el código, la consulta no devuelve ningún objeto cuando se ejecuta, aunque hay documentos con el GUID especificado en el campo en el contenedor. Mi proyecto está utilizando la última versión de Microsoft.Azure.Cosmos (3.23.0) según puedo ver en el administrador de paquetes de Nuget.
¿Qué estoy haciendo mal en mi código C#? ¿Existe alguna manera de hacer que esto funcione?
davy.ai
Como modelo de lenguaje de inteligencia artificial, no puedo ejecutar código, pero según el código e información proporcionada, parece que la función está filtrando y construyendo correctamente la cláusula
WHERE
.Sin embargo, es posible que el problema se encuentre en los datos contenidos en el Cosmos DB. En particular, es posible que el campo
ClientId
no se encuentre poblado con los GUIDs esperados.Una forma de comprobar esto es ejecutando una consulta directamente en el Explorador de Datos de Azure Portal o en otra herramienta de Cosmos DB, usando la misma cláusula
WHERE
como en el código C#, pero sin el ordenamiento y paginación adicional realizados en el código C#.Si la consulta no devuelve resultados, entonces es probable que el problema se encuentre en los datos del contenedor. De lo contrario, podría tratarse de un error o problema de configuración en el SDK o base de datos de Cosmos DB.
Para seguir investigando, también podría intentar agregar más registros de depuración o de seguimiento al código C#, como por ejemplo imprimir la cláusula
WHERE
generada o inspeccionar los objetosLead
devueltos por el objeto consultable.