Visão geral
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.
Dados de amostra
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; } = null!; 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.
Encontrar entidades
Encontre uma única entidade usando o método FirstOrDefault() ou encontre múltiplas entidades usando o método Where() .
Encontre uma única entidade
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);
Encontrar múltiplas entidades
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); }
Executar query de uma propriedade de sombra
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; } = null!; 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 framework 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); }
Verificar existência do campo
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.
Mql.Exists
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 planetNames = db.Planets .Where(p => Mql.Exists(p.hasRings)) .Select(p => p.name); foreach (var name in planetNames) { Console.WriteLine(name); }
Mql.IsMissing
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 planetNames = db.Planets .Where(p => Mql.IsMissing(p.hasRings)) .Select(p => p.name); foreach (var name in planetNames) { Console.WriteLine(name); }
Mql.IsNullOrMissing
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 planetNames = db.Planets .Where(p => Mql.IsNullOrMissing(p.hasRings)) .Select(p => p.name); foreach (var name in planetNames) { Console.WriteLine(name); }
Entidades de classificação
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.
Informações adicionais
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#: