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

Buscar y consultar datos de entidades con LINQ

Entity Framework Core le permite trabajar con datos en su aplicación sin ejecutar comandos de base de datos explícitamente. Para consultar sus datos, utilice la sintaxis de consulta integrada en el lenguaje (LINQ). LINQ permite escribir consultas fuertemente tipadas mediante palabras clave y operadores específicos de C#. Al ejecutar la aplicación, el proveedor de EF Core traduce automáticamente las consultas LINQ y las ejecuta en la base de datos mediante la API de consultas de MongoDB.

En esta guía, puedes ver ejemplos de operaciones de query comunes en una aplicación configurada para utilizar el proveedor EF Core.

Tip

Para aprender a configurar una aplicación para usar el Proveedor EF Core, consulta Configurar el proveedor central de EF.

Los ejemplos de esta guía utilizan el planets Colección de la base de datos sample_guides. Los documentos de esta colección utilizan la siguiente clase 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 colección es de la Atlas proporciona conjuntos de datos de ejemplo. Consulta la guía de inicio rápido para aprender a crear un clúster de MongoDB gratuito y cargar estos datos de ejemplo.

Encuentra una sola entidad usando el método FirstOrDefault(), o encuentra varias entidades usando el método Where().

El método FirstOrDefault() devuelve la primera entidad que encuentra en tu colección que coincide con los criterios de búsqueda y devuelve null si no se encuentran entidades coincidentes.

El siguiente código utiliza el método FirstOrDefault() para encontrar un planeta en el campo name de “Mercurio” a partir de un DBSet llamado Planets e imprime el nombre del planeta en la consola:

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

Puedes utilizar el método Where() para recuperar múltiples entidades de tus colecciones. Where() devuelve todas las entidades que coinciden con los criterios de búsqueda.

El siguiente código usa el método Where() para encontrar todos los planetas que tengan el campo hasRings establecido en true e imprime los nombres de los planetas en la consola.

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

Una propiedad de sombra es una propiedad que no está definida en la clase de entidad de .NET, pero que se incluye en el modelo de Entity Framework y se asigna a campos de la base de datos. Puede usar propiedades de sombra para consultar o realizar un seguimiento de los datos en sus documentos sin exponerlos como una propiedad de su entidad.

Para hacer referencia a una propiedad oculta en una consulta LINQ, llame al método EF.Property<T>() y pase el nombre de la propiedad configurada como argumento. El argumento de tipo genérico debe coincidir con el tipo de datos de la propiedad oculta.

Por ejemplo, la clase Planet no define una propiedad para el campo mainAtmosphere. Para configurar este campo como una propiedad oculta, llame al método Property<T>() en el método OnModelCreating() de PlanetDbContext, como se muestra en el siguiente ejemplo:

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

La llamada a modelBuilder.Entity<Planet>().Property<string[]>("mainAtmosphere") le indica al marco que incluya mainAtmosphere en el modelo y lo asigne a un campo string[] en MongoDB.

El siguiente código utiliza el método EF.Property<string[]>() para encontrar todos los planetas que tienen una propiedad de sombra mainAtmosphere no vacía e imprime los nombres de los planetas en la consola:

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

Puedes consultar documentos en función de si un campo existe, falta o tiene un valor null utilizando los métodos de la clase Mql.

Nota

Estos métodos funcionan tanto con propiedades reales como con propiedades ocultas.

El método Mql.Exists() coincide con los documentos que contienen el campo especificado, incluidos los documentos donde el valor del campo es null.

El siguiente código utiliza el método Mql.Exists() para encontrar todos los planetas que tienen el campo hasRings e imprime los nombres de los planetas en la consola:

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

El método Mql.IsMissing() coincide con los documentos que no contienen el campo especificado.

El siguiente código utiliza el método Mql.IsMissing() para encontrar todos los planetas que no tienen el campo hasRings e imprime los nombres de los planetas en la consola:

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

El método Mql.IsNullOrMissing() coincide con los documentos donde el campo especificado falta o tiene un valor null.

El siguiente código utiliza el método Mql.IsNullOrMissing() para encontrar todos los planetas donde falta el campo hasRings o null e imprime los nombres de los planetas en la consola:

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

Usa el método OrderBy() para especificar un orden en el que devolver las entidades de una query. OrderBy() ordena los elementos en orden ascendente según un criterio de clasificación especificado.

El siguiente código utiliza el método OrderBy() para encontrar todos los planetas y ordenarlos por el valor del campo orderFromSun en orden ascendente. Luego imprime los resultados en la consola.

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

Tip

Ordenar en orden descendente

Puedes ordenar los resultados de una query en orden descendente utilizando el método OrderByDescending().

Puedes realizar una clasificación secundaria en tu query utilizando el método ThenBy(). El método ThenBy() ordena los resultados del método OrderBy() en orden ascendente según un criterio de ordenación especificado. El método ThenBy() debe encadenarse al método OrderBy().

Tip

Orden secundario en orden descendente

Puede realizar una clasificación secundaria en orden descendente utilizando el método ThenByDescending().

El siguiente código utiliza los métodos OrderBy() y ThenBy() para encontrar todos los planetas y ordenarlos por el campo hasRings(), con una ordenación secundaria por el 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

Tip

Al ordenar campos con un valor booleano, las entidades con un valor de campo de false se muestran antes que aquellas con un valor de true.

Para aprender más información sobre los métodos tratados en esta guía, consulte los siguientes enlaces a la documentación de la API de .NET:

Para obtener más información sobre los métodos de la clase Mql, consulte los siguientes enlaces a la documentación de la API del controlador .NET/C#:

Volver

Configuración

En esta página