Docs Menu
Docs Home
/ /
CRUD

Filtrar y ordenar datos - SDK .NET

Para consultar, filtrar y ordenar datos en un dominio, utilice el motor de consultas de dominio. Hay dos maneras de usar el motor de consultas con el SDK de .NET:

  • LINQ Syntax

  • Lenguaje de consulta de reino

Debe utilizar la sintaxis LINQ para realizar consultas cuando sea posible, ya que se alinea con las convenciones .NET.

Nota

Acerca de los ejemplos de esta página

Los ejemplos de esta página utilizan un conjunto de datos simple para una aplicación de lista de tareas. Los dos tipos de objetos Realm son Project y Task. Un Task tiene un nombre, el nombre del asignado y una marca de finalización. También hay un número arbitrario para la prioridad (cuanto más alto, más importante) y un recuento de minutos dedicados a trabajar en él. Un Project tiene cero o más Tasks.

Vea el esquema de estas dos clases, Project y Task, a continuación:

public partial class Items : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
public string Name { get; set; }
public string Assignee { get; set; }
public bool IsComplete { get; set; }
public int Priority { get; set; }
public int ProgressMinutes { get; set; }
}
public partial class Project : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId ID { get; set; } = ObjectId.GenerateNewId();
public string Name { get; set; }
public IList<Items> Items { get; }
}

El motor de consultas de Realm implementa LINQ estándar sintaxis.

Hay varios operadores disponibles para filtrar una colección Realm con LINQ. Los filtros funcionan evaluando una expresión de operador para cada objeto de la colección que se filtra. Si la expresión se resuelve true como, realm incluye el objeto en la colección de resultados.

Una expresión consiste en uno de los siguientes:

  • El nombre de una propiedad del objeto que se está evaluando actualmente

  • Un operador

  • Un valor de cualquier tipo utilizado por el reino (cadena, fecha, número, booleano, etc.)

Nota

El SDK de Realm.NET no es compatible actualmente con todos los operadores LINQ. Consulte la sección "Operadores LINQ no compatibles" para obtener una lista de estos operadores.

Comparaciones de valores

Operador
Descripción
==

Se evalúa como true si la expresión de la izquierda es igual a la expresión de la derecha.

>

Se evalúa como true si la expresión numérica o de fecha de la izquierda es mayor que la de la derecha. Para las fechas, se evalúa como true si la fecha de la izquierda es posterior a la de la derecha.

>=

Se evalúa como true si la expresión numérica o de fecha de la izquierda es mayor o igual que la expresión numérica o de fecha de la derecha. Para las fechas, se evalúa como true si la fecha de la izquierda es posterior o igual a la de la derecha.

<

Se evalúa como true si la expresión numérica o de fecha de la izquierda es menor que la de la derecha. Para las fechas, se evalúa como true si la fecha de la izquierda es anterior a la de la derecha.

<=

Se evalúa como true si la expresión numérica de la izquierda es menor o igual que la de la derecha. Para las fechas, se evalúa como true si la fecha de la izquierda es anterior o igual a la de la derecha.

!=

Se evalúa como true si la expresión de la izquierda no es igual a la expresión de la derecha.

Ejemplo

El siguiente ejemplo utiliza los operadores de comparación del motor de consulta para:

  • Encuentre tareas de alta prioridad comparando el valor de la propiedad priority con un número umbral, por encima del cual la prioridad puede considerarse alta.

  • Encuentre tareas recién iniciadas o de corta duración observando si la propiedad progressMinutes se encuentra dentro de un rango determinado.

  • Encuentre tareas no asignadas buscando tareas donde la propiedad assignee sea igual a null.

  • Encuentre tareas asignadas a compañeros de equipo específicos, Ali o Jamie, viendo si la propiedad assignee está en una lista de nombres.

var highPri = items.Where(i => i.Priority > 5);
var quickItems = items.Where(i =>
i.ProgressMinutes >= 1 &&
i.ProgressMinutes < 15);
var unassignedItems = items.Where(i =>
i.Assignee == null);
var AliOrJamieItems = items.Where(i =>
i.Assignee == "Ali" ||
i.Assignee == "Jamie");

Puede utilizar los operadores lógicos enumerados en la siguiente tabla para crear predicados compuestos:

Operador
Descripción
&&

Se evalúa como true si las expresiones de la izquierda y la derecha son true.

!

Niega el resultado de la expresión dada.

||

Se evalúa como true si alguna expresión devuelve true.

Ejemplo

Podemos usar los operadores lógicos del lenguaje de consulta para encontrar todas las tareas completadas de Ali. Es decir, buscamos todas las tareas donde el valor de la propiedad assignee es igual a 'Ali' y el valor de la propiedad isComplete es true:

var completedItemsForAli = items
.Where(i => i.Assignee == "Ali" && i.IsComplete);

Puedes comparar valores string utilizando los operadores de string enumerados en la siguiente tabla. Los comodines tipo regex permiten mayor flexibilidad en la búsqueda.

Operador
Descripción

StartsWith

Se evalúa como true si la expresión de cadena de la izquierda comienza con la expresión de cadena de la derecha. Es similar a contains, pero solo coincide si la expresión de cadena de la izquierda se encuentra al principio de la expresión de cadena de la derecha.

EndsWith

Se evalúa como true si la expresión de cadena de la izquierda termina con la expresión de cadena de la derecha. Es similar a contains, pero solo coincide si la expresión de cadena de la izquierda se encuentra al final de la expresión de cadena de la derecha.

Like

Se evalúa como true si la expresión de cadena de la izquierda coincide con la expresión de cadena comodín de la derecha. Una expresión de cadena comodín es una cadena que utiliza caracteres normales con dos caracteres comodín especiales:

  • El comodín * coincide con cero o más de cualquier carácter

  • El comodín ? coincide con cualquier carácter.

Por ejemplo, la cadena comodín "d?g" coincide con "perro", "dig" y "dug", pero no con "ding", "dg" o "un perro".

Equals

Se evalúa como true si la cadena de la izquierda es lexicográficamente igual a la cadena de la derecha.

Contains

Evalúa como true si la expresión de string a la izquierda se encuentra en cualquier parte de la expresión de string a la derecha.

string.IsNullOrEmpty

Se evalúa como true si la expresión de cadena de la izquierda es nula o está vacía. Tenga en cuenta que IsNullOrEmpty() es un método estático en string.

Ejemplo

Los siguientes ejemplos utilizan los operadores de cadena del motor de consulta para encontrar tareas:

// Note: In each of the following examples, you can replace the
// Where() method with First(), FirstOrDefault(),
// Single(), SingleOrDefault(),
// Last(), or LastOrDefault().
// Get all items where the Assignee's name starts with "E" or "e"
var ItemssStartWithE = items.Where(i => i.Assignee.StartsWith("E",
StringComparison.OrdinalIgnoreCase));
// Get all items where the Assignee's name ends wth "is"
// (lower case only)
var endsWith = items.Where(t =>
t.Assignee.EndsWith("is", StringComparison.Ordinal));
// Get all items where the Assignee's name contains the
// letters "ami" in any casing
var itemsContains = items.Where(i => i.Assignee.Contains("ami",
StringComparison.OrdinalIgnoreCase));
// Get all items that have no assignee
var null_or_empty = items.Where(i => string.IsNullOrEmpty(i.Assignee));

Importante

Comparaciones de casos

Al evaluar cadenas, el segundo parámetro en todas las funciones,excepto, Like debe ser StringComparison.OrdinalIgnoreCase StringComparison.Ordinalo. Para el Like() método, el segundo parámetro es un valor booleano (donde "true" significa que distingue entre mayúsculas y minúsculas).

Puede usar LINQ para consultar propiedades con índices de búsqueda de texto completo (FTS). Para ello, utilice QueryMethods.FullTextSearch. Los siguientes ejemplos consultan el Person.Biography campo:

// Find all people with "scientist" and "Nobel" in their biography
var scientists = realm.All<Person>()
.Where(p => QueryMethods.FullTextSearch(p.Biography, "scientist Nobel"));
// Find all people with "scientist" in their biography, but not "physics"
var scientistsButNotPhysicists = realm.All<Person>()
.Where(p => QueryMethods.FullTextSearch(p.Biography, "scientist -physics"));

Los siguientes operadores LINQ actualmente no son compatibles con el SDK de Realm .NET:

Categoría
Operadores no compatibles
Concatenation
  • Concat

  • JoinAunque Join no es compatible, no es necesario con Realm. En lugar de usar claves en una instrucción Join, como se haría en una base de datos relacional tradicional, se puede referenciar otro tipo como propiedad. Para obtener más información, consulte Objetos incrustados - SDK de .NET.

  • GroupJoin

Grouping
  • GroupBy

Partitioning
  • Take

  • Skip

  • TakeWhile

  • SkipWhile

Projection
  • SelectMany

  • Select, con una excepción: cuando se utiliza con la sintaxis de consulta, se admite Select siempre que seleccione el objeto Realm en sí y no un derivado:

    var tasks = from t in realm.All<Task>() where t.Assignee == "Caleb" select t;

Sets
  • Distinct

  • Union

  • Intersect

  • Except

También puede usar el lenguaje de consulta de dominios (RQL) para consultar dominios. RQL es un lenguaje de consulta basado en cadenas que se utiliza para acceder al motor de consultas. Al usar RQL, se utiliza el método Filter():

var elvisProjects = projects.Filter("Items.Assignee == $0", "Elvis");

Importante

Dado que LINQ permite la comprobación de errores de consultas en tiempo de compilación, debería usarlo en lugar de RQL en la mayoría de los casos. Si necesita funciones que superen las capacidades actuales de LINQ, como la agregación, utilice RQL.

Los operadores de agregación recorren una colección y la reducen a un único valor. Tenga en cuenta que las agregaciones utilizan el método Filter(), que permite crear consultas más complejas que actualmente no son compatibles con el proveedor LINQ. Filter() admite las cláusulas SORT y DISTINCT, además del filtrado.

Para obtener más información sobre los operadores agregados disponibles, consulte la referencia de operadores agregados de Realm Query Language.

Los siguientes ejemplos muestran diferentes formas de agregar datos:

// Get all projects with an average Item priorty > 5:
var avgPriority = projects.Filter(
"Items.@avg.Priority > $0", 5);
// Get all projects where all Items are high-priority:
var highPriProjects = projects.Filter(
"Items.@min.Priority > $0", 5);
// Get all projects with long-running Items:
var longRunningProjects = projects.Filter(
"Items.@sum.ProgressMinutes > $0", 100);

Puede usar RQL para consultar propiedades con índices de búsqueda de texto completo (FTS). Para consultar estas propiedades, utilice el TEXT operador. El siguiente ejemplo consulta el Person.Biography campo:

// Find all people with "scientist" and "Nobel" in their biography
var filteredScientists = realm.All<Person>()
.Filter("Biography TEXT $0", "scientist Nobel");
// Find all people with "scientist" in their biography, but not "physics"
var filteredScientistsButNotPhysicists = realm.All<Person>()
.Filter("Biography TEXT $0", "scientist -physics");

Una operación de ordenación permite configurar el orden en que Realm devuelve los objetos consultados. Puede ordenarlos según una o más propiedades de los objetos de la colección de resultados.

Realm solo garantiza un orden consistente de resultados cuando los resultados están ordenados.

Ejemplo

El siguiente código ordena los proyectos por nombre en orden alfabético inverso (es decir, orden "descendente").

var projectsSorted = projects.OrderByDescending(p => p.Name);

Volver

Lea

En esta página