Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Menu Docs
Página inicial do Docs
/ /
/ / /

Localizar e query dados de entidade com LINQ

O Entity Framework Core permite que você trabalhe com dados em seu aplicação sem executar os comandos do banco de dados de dados explicitamente. Para consultar seus dados, use a sintaxe Query integrada da linguagem (LINQ). O LINQ permite que você escreva queries fortemente digitadas usando palavras-chave e operadores específicos do C#. Quando você executa o aplicação, o EF Core Provider traduz automaticamente as queries do LINQ e as executa no banco de banco de dados usando a MongoDB Query API.

Neste guia, você pode ver exemplos de operações de query comuns em um aplicação configurado para usar o EF Core Provider.

Dica

Para saber como configurar um aplicação para usar o fornecedor do EF Core, consulte Configurar o fornecedor do EF Core.

Os exemplos nesta guia usam a coleção planets do banco de dados do sample_guides . Os documentos nesta coleção utilizam a seguinte classe Planet como modelo:

public class Planet
{
public ObjectId _id { get; set; }
public string name { get; set; }
public int orderFromSun { get; set; }
public bool hasRings { get; set; }
}

Esta coleção é dos conjuntos de dados de amostra fornecidos pelo Atlas. Consulte o guia Início rápido para saber como criar um cluster MongoDB gratuito e carregar esses dados de amostra.

Encontre uma única entidade usando o método FirstOrDefault() ou encontre múltiplas entidades usando o método Where() .

O método FirstOrDefault() retorna a primeira entidade que encontra na sua collection que corresponda aos critérios de pesquisa e retorna null se nenhuma entidade correspondente for encontrada.

O código a seguir usa o método FirstOrDefault() para localizar um planeta com o campo name de "Mercury" de um DBSet chamado Planets e imprime o nome do planeta no console:

var planet = db.Planets.FirstOrDefault(p => p.name == "Mercury");
Console.WriteLine(planet.name);

Você pode utilizar o método Where() para recuperar múltiplas entidades de sua collection. Where() retorna todas as entidades que correspondem aos critérios de pesquisa.

O código a seguir usa o método Where() para encontrar todos os planetas que têm o campo hasRings definido como true e imprime os nomes dos planetas no console.

var planets = db.Planets.Where(p => p.hasRings);
foreach (var p in planets)
{
Console.WriteLine(p.name);
}

Uma propriedade shadow é uma propriedade que não está definida em sua classe de entidade .NET, mas está incluída no modelo Entity Framework e mapeada para campos no banco de dados. Você pode usar propriedades de sombra para query ou acompanhar dados em seus documentos sem expô-los como uma propriedade em sua entidade.

Para fazer referência a uma propriedade de sombra em uma query LINQ, chame o método EF.Property<T>() e passe o nome da propriedade configurada como um argumento. O argumento de tipo genérico deve corresponder ao tipo de dados da propriedade shadow .

Por exemplo, a classe Planet não define uma propriedade para o campo mainAtmosphere. Para configurar este campo como uma propriedade de sombra, chame o método Property<T>() no método OnModelCreating() de PlanetDbContext, como mostrado no seguinte exemplo:

public class PlanetDbContext : DbContext
{
public DbSet<Planet> Planets { get; init; }
public static PlanetDbContext Create(IMongoDatabase database) =>
new(new DbContextOptionsBuilder<PlanetDbContext>()
.UseMongoDB(database.Client, database.DatabaseNamespace.DatabaseName)
.Options);
public PlanetDbContext(DbContextOptions options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Planet>().ToCollection("planets");
modelBuilder.Entity<Planet>().Property<string[]>("mainAtmosphere");
}
}

A chamada para modelBuilder.Entity<Planet>().Property<string[]>("mainAtmosphere") instrui a estrutura a incluir mainAtmosphere no modelo e mapeá-lo para um campo string[] no MongoDB.

O código a seguir usa o método EF.Property<string[]>() para localizar todos os planetas que têm uma propriedade shadow mainAtmosphere não vazia e imprime os nomes dos planetas no console:

var planets = db.Planets.Where(
p => EF.Property<string[]>(p, "mainAtmosphere").Length > 0);
foreach (var p in planets)
{
Console.WriteLine(p.name);
}

Você pode fazer query de documentos com base no fato de um campo existir, estar ausente ou ter um valor null usando os métodos da classe Mql .

Observação

Esses métodos funcionam com propriedades reais e propriedades de sombra.

O método Mql.Exists() combina documentos que contêm o campo especificado, incluindo documentos em que o valor de campo é null.

O código a seguir usa o método Mql.Exists() para encontrar todos os planetas que têm o campo hasRings e imprime os nomes dos planetas no console:

var planets = db.Planets.Where(p => Mql.Exists(p.hasRings));
foreach (var p in planets)
{
Console.WriteLine(p.name);
}

O método Mql.IsMissing() corresponde a documentos que não contêm o campo especificado.

O código a seguir usa o método Mql.IsMissing() para encontrar todos os planetas que não têm o campo hasRings e imprime os nomes dos planetas no console:

var planets = db.Planets.Where(p => Mql.IsMissing(p.hasRings));
foreach (var p in planets)
{
Console.WriteLine(p.name);
}

O método Mql.IsNullOrMissing() corresponde a documentos em que o campo especificado está ausente ou tem um valor null.

O código a seguir usa o método Mql.IsNullOrMissing() para encontrar todos os planetas onde o campo hasRings está ausente ou null e imprime os nomes dos planetas no console:

var planets = db.Planets.Where(p => Mql.IsNullOrMissing(p.hasRings));
foreach (var p in planets)
{
Console.WriteLine(p.name);
}

Utilize o método OrderBy() para especificar uma ordem na qual retornar entidades de uma query. OrderBy() classifica os elementos em ordem crescente com base em critérios de classificação especificados.

O código a seguir usa o método OrderBy() para encontrar todos os planetas e classificá-los pelo valor do campo orderFromSun em ordem crescente. Em seguida, ele imprime os resultados no console.

var planetList = db.Planets.OrderBy(p => p.orderFromSun);
foreach (var p in planetList)
{
Console.WriteLine(p.name);
}
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune

Dica

Classificar em ordem decrescente

Você pode classificar os resultados de uma query em ordem decrescente utilizando o método OrderByDescending() .

Você pode executar uma classificação secundária em sua query usando o método ThenBy() . O método ThenBy() classifica os resultados do método OrderBy() em ordem crescente com base em critérios de classificação especificados. O método ThenBy() deve ser encadeado ao método OrderBy() .

Dica

Classificação secundária em ordem decrescente

Você pode executar uma classificação secundária em ordem decrescente usando o método ThenByDescending() .

O código a seguir usa os métodos OrderBy() e ThenBy() para encontrar todos os planetas e classificá-los pelo campo hasRings() , com uma classificação secundária no campo name .

var planetList = db.Planets.OrderBy(o => o.hasRings).ThenBy(o => o.name);
foreach (var p in planetList)
{
Console.WriteLine("Has rings: " + p.hasRings + ", Name: " + p.name);
}
Has rings: False, Name: Earth
Has rings: False, Name: Mars
Has rings: False, Name: Mercury
Has rings: False, Name: Venus
Has rings: True, Name: Jupiter
Has rings: True, Name: Neptune
Has rings: True, Name: Saturn
Has rings: True, Name: Uranus

Dica

Ao ordenar em campos com um valor booleano, as entidades com um valor de campo de false são exibidas antes daquelas com um valor de true.

O EF Core Provider oferece suporte aos seguintes métodos de agregação escalar:

  • Count(): retorna o número de elementos em uma coleção ou o número de documentos que correspondem a um predicado

  • LongCount(): retorna o número de elementos em uma coleção como long ou o número de documentos que correspondem a um predicado

  • Any(): retorna true se algum elemento em uma coleção corresponder ao predicado

  • Max(): retorna o valor máximo de um campo especificado em uma coleção

  • Min(): retorna o valor mínimo de um campo especificado em uma coleção

  • Sum(): retorna a soma de valores de um campo especificado em uma coleção

  • Average(): retorna a média de valores de um campo especificado em uma coleção

As seções a seguir mostram exemplos de cada um dos métodos anteriores.

O exemplo seguinte utiliza o método Count() para contar o número de elementos na collection Planets:

var planetCount = db.Planets.Count();
Console.WriteLine("Planet Count: " + planetCount);

O exemplo seguinte utiliza o método Count() para contar o número de elementos na coleção Planets que têm um campo hasRings configurado para true:

var planetCountWithRings = db.Planets.Count(p => p.hasRings);
Console.WriteLine("Planet Count with Rings: " + planetCountWithRings);

O exemplo seguinte utiliza o método LongCount() para contar o número de elementos na coleção Planets e retorna o resultado como um long:

var planetCountLong = db.Planets.LongCount();
Console.WriteLine("Long Planet Count: " + longCount);

O exemplo seguinte utiliza o método LongCount() para contar o número de elementos na coleção Planets que têm um campo hasRings configurado para true e retorna o resultado como long:

var planetCountLongWithRings = db.Planets.LongCount(p => p.hasRings);
Console.WriteLine("Long Planet Count with Rings: " + planetCountLongWithRings);

O exemplo seguinte utiliza o método Any() para verificar se algum elemento na coleção Planets tem um campo hasRings configurado para true:

var results = db.Planets.Any(p => p.hasRings);
foreach (var p in results)
{
Console.WriteLine("Planet with Rings: " + p.name);
}

O exemplo seguinte utiliza o método Max() para localizar o valor máximo do campo orderFromSun na collection Planets:

var furthestPlanet = db.Planets.Max(p => p.orderFromSun);
Console.WriteLine("Furthest Planet: " + furthestPlanet.name);

O exemplo seguinte utiliza o método Min() para localizar o valor mínimo do campo orderFromSun na collection Planets:

var closestPlanet = db.Planets.Min(p => p.OrderFromSun);
Console.WriteLine("Closest Planet: " + closestPlanet.Name);

O exemplo a seguir utiliza o método Sum() para localizar a soma do campo mass na coleção Planets:

var totalMass = db.Planets.Sum(p => p.mass);
Console.WriteLine("Total Mass of Planets: " + totalMass);

O exemplo seguinte utiliza o método Average() para localizar o valor médio do campo mass na collection Planets:

var averageMass = db.Planets.Average(p => p.mass);
Console.WriteLine("Average Mass of Planets: " + averageMass);

Para saber mais sobre aggregations no MongoDB, consulte o guia Operações de agregação no manual do MongoDB Server.

Para saber mais sobre os métodos discutidos nesta guia, consulte os seguintes links de documentação da API .NET:

Para saber mais sobre os métodos de classe Mql, consulte os seguintes links de documentação da API do driver .NET/C#:

Voltar

Configuração

Nesta página