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:
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 { [] [] 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 { [] [] public ObjectId ID { get; set; } = ObjectId.GenerateNewId(); public string Name { get; set; } public IList<Items> Items { get; } }
Consulta con LINQ
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.
Operadores de comparación
Comparaciones de valores
Operador | Descripción |
|---|---|
== | Se evalúa como |
> | Se evalúa como |
>= | Se evalúa como |
< | Se evalúa como |
<= | Se evalúa como |
!= | Se evalúa como |
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
prioritycon 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
progressMinutesse encuentra dentro de un rango determinado.Encuentre tareas no asignadas buscando tareas donde la propiedad
assigneesea igual anull.Encuentre tareas asignadas a compañeros de equipo específicos, Ali o Jamie, viendo si la propiedad
assigneeestá 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");
Operadores lógicos
Puede utilizar los operadores lógicos enumerados en la siguiente tabla para crear predicados compuestos:
Operador | Descripción |
|---|---|
&& | Se evalúa como |
! | Niega el resultado de la expresión dada. |
|| | Se evalúa como |
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);
Operadores de String
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 |
|---|---|
| Se evalúa como |
EndsWith | Se evalúa como |
Like | Se evalúa como
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 |
Contains | Evalúa como |
string.IsNullOrEmpty | Se evalúa como |
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).
Full Text Search
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"));
Operadores LINQ no compatibles
Los siguientes operadores LINQ actualmente no son compatibles con el SDK de Realm .NET:
Categoría | Operadores no compatibles |
|---|---|
Concatenation |
|
Grouping |
|
Partitioning |
|
Projection |
|
Sets |
|
Consulta con el lenguaje de consulta Realm
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.
Operadores agregados
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);
Full Text Search
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");
Ordene los resultados del query
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);