Menu Docs

Página inicial do DocsDesenvolver aplicaçõesAtlas Device SDKs

Filtrar e classificar dados - .NET SDK

Nesta página

  • Query com LINQ
  • Operadores de comparação
  • Operadores lógicos
  • Operadores de strings
  • Busca de texto completo
  • Operadores LINQ não compatíveis
  • Consulta com linguagem de query de realm
  • Operadores agregados
  • Busca de texto completo
  • Classificar Resultados da Consulta

Para consultar, filtrar e classificar dados em um realm, use o mecanismo de query do Realm. Há duas maneiras de usar o mecanismo de query com o .NET SDK:

Você deve usar a sintaxe LINQ para consultar quando possível, pois ela se alinha com convenções .NET.

Observação

Sobre os exemplos desta página

Os exemplos nesta página usam um conjunto de dados simples para uma aplicação de lista de tarefas. Os dois tipos de objetos de Realm são Project e Task. Task tem um nome, o nome do responsável e um sinalizador finalizado. Há também um número arbitrário de prioridade – maior é mais importante – e o número de minutos gastos na operação. Um Project tem zero ou mais Tasks.

Consulte o esquema para estas duas classes, Project e Task, abaixo:

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

O mecanismo de query do Realm implementa a sintaxe do LINQ padrão.

Existem vários operadores disponíveis para filtrar uma collection do Realm com LINQ. Os filtros funcionam avaliando uma expressão de operador para cada objeto na collection que está sendo filtrada. Se a expressão resolver para true, o domínio incluirá o objeto na coleção de resultados.

Uma expressão é uma das seguintes opções:

  • O nome de uma propriedade do objeto que está sendo avaliado

  • Um operador

  • Um valor de qualquer tipo usado pelo domínio (string, data, número, booleano etc.)

Observação

O .NET SDK do Realm não é compatível atualmente com todos os operadores do LINQ. Consulte a seção Operadores do LINQ sem suporte para obter uma lista desses operadores.

Comparações de valor

Operador
Descrição
==
Avalia para true se a expressão do lado esquerdo é igual à expressão do lado direito.
>
Avalia como true se a expressão numérica ou de data do lado esquerdo é maior que a expressão numérica ou de data do lado direito. Com datas, avalia como true se a data do lado esquerdo é posterior à data do lado direito.
>=
Avalia como true se a expressão numérica ou de data do lado esquerdo é maior ou igual à expressão numérica ou de data do lado direito. Com datas, avalia como true se a data do lado esquerdo é posterior ou igual à data do lado direito.
<
Avalia como true se a expressão numérica ou de data do lado esquerdo é menor que a expressão numérica ou de data do lado direito. Com datas, avalia como true se a data do lado esquerdo é anterior à data do lado direito.
<=
Avalia como true se a expressão numérica à esquerda for menor ou igual à expressão numérica à direita. Com datas, avalia como true se a data do lado esquerdo é anterior ou igual à data do lado direito.
!=
Avalia como true se a expressão do lado esquerdo não é igual à expressão do lado direito.

Exemplo

O exemplo a seguir usa operadores de comparação do mecanismo de consulta para:

  • Encontre tarefas de alta prioridade comparando o valor da propriedade priority com um número limite, acima do qual a prioridade pode ser considerada alta.

  • Encontre tarefas recém-iniciadas ou de curta duração verificando se a propriedade progressMinutes está dentro de um determinado intervalo.

  • Encontre tarefas não atribuídas encontrando tarefas onde a propriedade assignee é igual a null.

  • Encontre tarefas atribuídas a membros específicos da equipe Ali ou Jamie verificando se a propriedade assignee está em uma lista de nomes.

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

Você pode usar os operadores lógicos listados na tabela a seguir para fazer predicados compostos:

Operador
Descrição
&&
Avalia para true se as expressões da esquerda e da direita forem true.
!
Nega o resultado da expressão fornecida.
||
Avalia como true se qualquer uma das expressões retornar true.

Exemplo

Podemos usar os operadores lógicos da linguagem de consulta para encontrar todas as tarefas concluídas de Ali. Ou seja, encontramos todas as tarefas em que o valor da propriedade assignee é igual a "Ali" E o valor da propriedade isComplete é true:

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

Você pode comparar valores de string usando os operadores de string listados na tabela seguinte. Curingas do tipo Regex permitem mais flexibilidade na pesquisa.

Operador
Descrição
StartsWith
Avalia como true se a expressão de string à esquerda começar com a expressão de string à direita. Isso é semelhante ao contains, mas só corresponde se a expressão de string à esquerda for encontrada no início da expressão de string à direita.
EndsWith
Avalia como true se a expressão de string à esquerda terminar com a expressão de string à direita. Isso é semelhante ao contains, mas só corresponde se a expressão de cadeia de caracteres à esquerda for encontrada no final da expressão de cadeia de caracteres à direita.
Like

Avalia como true se a expressão de string à esquerda corresponder à expressão de string curinga de string à direita. Uma expressão de string curinga é uma string que usa caracteres normais com dois caracteres curinga especiais:

  • O curinga * corresponde a zero ou mais de qualquer caractere

  • O curinga ? corresponde a qualquer caractere.

Por exemplo, a cadeia curinga "d?g" corresponde a "dog", "dig" e "cavg", mas não "ding", "dg" ou "a dog".

Equals
Avalia para true se a string esquerda for lexicograficamente igual à string direita.
Contains
Avaliado como true se a expressão de string à esquerda for encontrada em qualquer lugar na expressão de string à direita.
string.IsNullOrEmpty
Avalia para true se a expressão da string esquerda for nula ou vazia. Note que IsNullOrEmpty() é um método estático em string.

Exemplo

Os exemplos a seguir usam os operadores de string do mecanismo de query para localizar tarefas:

// 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

Comparações de caso

Ao avaliar strings, o segundo parâmetro em todas os roles exceto Like deve ser StringComparison.OrdinalIgnoreCase ou StringComparison.Ordinal. Para o método Like() , o segundo parâmetro é um valor booleano (onde "true" significa "diferencia maiúsculas de minúsculas").

Você pode usar o LINQ para {query} {properties} que possuem {índice de pesquisa} (FTS). Para consultar essas propriedades, use QueryMethods.FullTextSearch. Os exemplos a seguir consultam o campo Person.Biography :

// 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"));

No momento, os seguintes operadores LINQ não são compatíveis com o Realm .NET SDK:

categoria
Operadores não suportados
Concatenação
  • Concat

  • Join. Embora Join não seja compatível, ele não é necessário com o Realm. Em vez de usar chaves em uma declaração Join, como faria em um banco de dados relacional tradicional, você pode fazer referência a outro tipo como uma propriedade. Para obter mais informações, consulte Objetos embarcados - .NET SDK.

  • GroupJoin

Agrupamento
  • GroupBy

Particionamento
  • Take

  • Skip

  • TakeWhile

  • SkipWhile

Projeção
  • SelectMany

  • Select, com uma exceção: quando usado com a sintaxe de query, o Select é aceito desde que você selecione o próprio objeto de Realm e não um derivado:

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

Conjuntos
  • Distinct

  • Union

  • Intersect

  • Except

Também é possível usar a Realm Query Language (RQL) para consultar realms. O RQL é uma linguagem de query baseada em string usada para acessar o mecanismo de query. Ao usar RQL, você usa o método Filter() :

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

Importante

Como o LINQ fornece verificação de erros em tempo de compilação de queries, você deve usá-lo em vez do RQL na maioria dos casos. Se você exigir recursos além das capacidades atuais do LINQ, como usar agregação, use RQL.

Operadores agregados atravessam uma collection e a reduzem para um único valor. Observe que as aggregations usam o método Filter() , que pode ser usado para criar queries mais complexas que atualmente não são compatíveis com o provedor LINQ. Filter() é compatível com cláusulas SORT e DISTINCT, além de filtragem.

Para obter mais informações sobre os operadores agregados disponíveis, consulte a Realm Query Language aggregate operator reference.

Os exemplos a seguir mostram maneiras diferentes de agregar dados:

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

Você pode usar o RQL para consultar propriedades que tenham índices the busca de texto completa (FTS) nelas. Para consultar essas propriedades, use o operador TEXT. O seguinte exemplo consulta o campo Person.Biography:

// 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");

Uma operação de classificação permite configurar a ordem na qual o Realm retorna objetos consultados. A classificação pode ser feita com base em uma ou mais propriedades dos objetos na collection de resultados.

O Realm garante apenas uma ordem consistente de resultados quando os resultados são classificados.

Exemplo

O código a seguir classifica os projetos por nome em ordem alfabética inversa (ou seja, "ordem decrescente").

var projectsSorted = projects.OrderByDescending(p => p.Name);
← Ler dados - .NET SDK