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.

El objeto de C# no admite FirstOrDefault() dependiendo del parámetro de entrada.

No sé por qué el valor de retorno de la función LoadData (mostrada a continuación) en un caso admite el método FirstOrDefault() y en otro caso no. En ambos casos es el mismo tipo de retorno.

La única diferencia es la forma en que se crea el parámetro dinámico.

“` C#
public async Task<LookupModel?> UpdateLookup(LookupModel item, Guid newUk)
var p1 = new
{
item.Code,
item.Name,
item.uk,
newUk
};

var result1 = await _db.LoadData<LookupModel, dynamic>("lu.Lookup_Update", p1);
// result1.GetType() = System.Collections.Generic.List`1[DataAccess.Models.Lookups.LookupModel]
var rtv1 = result1.FirstOrDefault(); // ok

var p2 = item.GetUpdateParams(newUk);

var result2 = await _db.LoadData<LookupModel, dynamic>("lu.Lookup_Update", p2);
// result2.GetType() = System.Collections.Generic.List`1[DataAccess.Models.Lookups.LookupModel]
var rtv2 = result2.FirstOrDefault(); // not ok
// Esto genera una excepción ya que FirstOrDefault() no está definido

return rtv1;
}

// LookupModel
public dynamic GetUpdateParams(Guid newUk)
{
return new
{
this.Code,
this.Name,
this.uk,
newUK
};
}

// LoadData
public async Task<IEnumerable<T>> LoadData<T, U>(string storedProcedure, U parameters, string connectionId = "Default")
{
using IDbConnection connection = new SqlConnection(_config.GetConnectionString(connectionId));
return await connection.QueryAsync<T>(storedProcedure, parameters, commandType: CommandType.StoredProcedure);

}
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual el valor de retorno de la función LoadData admite el método FirstOrDefault() en un caso y no en el otro se debe a la diferencia en el tipo de parámetro dinámico que se pasa. En el primer caso, el parámetro dinámico ‘p1’ se define en línea como un objeto anónimo con las propiedades ‘Code’, ‘Name’, ‘uk’ y ‘newUk’. En el segundo caso, el parámetro dinámico se crea llamando al método ‘GetUpdateParams’ que devuelve un objeto dinámico. El problema parece estar relacionado con el tipo de objeto dinámico: en el primer caso, las propiedades se infieren como cadenas, mientras que en el segundo caso, se infieren como objetos. Esto significa que cuando se llama a ‘FirstOrDefault()’ en el resultado de la segunda consulta, espera encontrar el primer objeto en la colección en lugar de la primera cadena. Para solucionar esto, debemos convertir el resultado de la segunda consulta a un IEnumerable antes de llamar a ‘FirstOrDefault()’.

Comments are closed.