es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Referirse a un elemento hijo utilizando la cláusula SELECT de LINQ en línea.

Estoy construyendo un modelo personalizado a partir de una lista de objetos y el código que estoy utilizando es el siguiente:

“`c#
var dataset = await query.Select(c => new ContactListModel
{
Id = c.Id,
FirstName = c.FirstName,
LastName = c.LastName,
Email = c.Email,
EmailAlternative = c.EmailAlternative,
JobTitle = c.JobTitle,
CompanyName = (c.Company != null) ? c.Company.Name : "",
AddressCountry = c.Addresses.FirstOrDefault(a => a.IsPrimary) != null ? c.Addresses.FirstOrDefault(a => a.IsPrimary).Country.Name : "",
AddressCounty = c.Addresses.FirstOrDefault(a => a.IsPrimary) != null ? c.Addresses.FirstOrDefault(a => a.IsPrimary).CountyText : "",
AddressPostCode = c.Addresses.FirstOrDefault(a => a.IsPrimary) != null ? c.Addresses.FirstOrDefault(a => a.IsPrimary).PostCode : ""
}).OrderByDynamic(sortBy, sortDirection).Paginate((tableState.Page * tableState.PageSize), tableState.PageSize).ToListAsync();

<pre><code><br />Al asignar propiedades como AddressCountry, AddressCounty y AddressPostCode (hay 2 o 3 propiedades más como esta que deben asignarse desde la instancia PrimaryAddress), me refiero al elemento PrimaryAddress de la lista de valores de dirección disponibles vinculados al objeto.

¿Hay alguna forma de evitar la repetición de filtrado a PrimaryAddress cada vez que se establece la propiedad?

Intenté agregar una propiedad adicional llamada PrimaryAddress de tipo ContactAddress y luego dentro de la declaración select anterior asigné el valor de la siguiente manera:

“`c#
var dataset = await query.Select(c => new ContactListModel
{
—–
PrimaryAddress = c.Addresses.FirstOrDefault(a => a.IsPrimary),
AddressCountry = PrimaryAddress.Country.Name,
AddressCounty = PrimaryAddress.CountyText,

}).OrderByDynamic(sortBy, sortDirection).Paginate((tableState.Page * tableState.PageSize), tableState.PageSize).ToListAsync();

Pero el error que estoy obteniendo es que el nombre ‘PrimaryAddress’ no existe en el contexto actual.

OrderByDynamic y Paginate se utilizan para manejar la ordenación y la paginación y son extensiones auxiliares que utilicé.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para evitar la repetición del filtrado a PrimaryAddress, puedes crear una variable local dentro de la instrucción Select y asignarle el valor de PrimaryAddress. Luego puedes usar esta variable para asignar valores a otras propiedades como AddressCountry, AddressCounty, etc.

    c#
    var dataset = await query.Select(c => {
    // Crea una variable local y asígnale PrimaryAddress
    var primaryAddress = c.Addresses.FirstOrDefault(a => a.IsPrimary);
    return new ContactListModel {
    Id = c.Id,
    FirstName = c.FirstName,
    LastName = c.LastName,
    Email = c.Email,
    EmailAlternative = c.EmailAlternative,
    JobTitle = c.JobTitle,
    CompanyName = (c.Company != null) ? c.Company.Name : "",
    AddressCountry = primaryAddress != null ? primaryAddress.Country.Name : "",
    AddressCounty = primaryAddress != null ? primaryAddress.CountyText : "",
    AddressPostCode = primaryAddress != null ? primaryAddress.PostCode : ""
    };
    }).OrderByDynamic(sortBy, sortDirection).Paginate((tableState.Page * tableState.PageSize), tableState.PageSize).ToListAsync();

    Al crear una variable local dentro de la instrucción Select, puedes evitar la repetición del filtrado a PrimaryAddress y hacer que tu código sea más legible y mantenible.

Comments are closed.