stored guide framework dapper

guide - dapper vs entity framework



¿Puedo asignar un resultado a Tuple en Dapper? (4)

Estoy intentando seleccionar una lista de 2 columnas de enteros que asignan los resultados a una tupla. Solo como un ejemplo:

return connection.Query<Tuple<int,int>>("select id1, id2 from sometable").ToList();

no funciona, pero la misma consulta funciona si creo una clase con dos enteros como:

return connection.Query<BogusClass>("select id1, id2 from sometable").ToList(); public class BogusClass{ public int id1 {get;set;} public int id2 {get;set;} }

Mi preferencia es no tener que crear una clase falsa solo para obtener algunos datos para trabajar. En este caso, son dos columnas enteras, pero hay otros casos de uso que podría pensar.

Editar - Respuesta: esta es la sintaxis que funcionó para mí HTH

cambiado:

return connection.Query<Tuple<int,int>>("select id1, id2 from sometable").ToList();

a:

return connection.Query<int, int, Tuple<int, int>>("select id1, id2 from sometable", Tuple.Create, splitOn: "*").ToList();


Aquí hay un ejemplo de trabajo:

public class DapperTests { [Test] public void TuppleTest() { var conn = new SqlConnection(@"Data Source=./sqlexpress; Integrated Security=true; Initial Catalog=mydb"); conn.Open(); var result = conn.Query<int, int, Tuple<int, int>>( "select 1,2 union all select 4,5", Tuple.Create, splitOn: "*").ToList(); conn.Close(); Assert.That(result.Count, Is.EqualTo(2)); } }

Puedes encontrar más ejemplos here .


Esto funciona a partir de C # 7. Este es un valor Tuple

public (int Id, DateTime? PublishDate) GetItem(string id) { const string sqlCommand = "select top 1 Id, PublishDate from Item where Id = @id"; return _connection.Query<(int, DateTime?)>(sqlCommand, new { id }).FirstOrDefault(); }

Usando el metodo

var item = GetItem(123); Console.WriteLine($"The publish date of item [{item.Id}] is [{item.PublishDate.Value}]");

Asegúrate de haber instalado Dapper 1.50.4 o posterior.


Te puede gustar asi

string query = "Select value1 as Item1,value2 as Item2 from #sometable"; var data = db.Query<Tuple<int,int>>(query);


Tuple es una opción, prefiero usar un resultado dinámico siempre que no quiera crear una clase, es decir,

string sql = "Select ''f'' as Foo, ''b'' as Bar"; var result = connection.Query<dynamic>(sql).Single(); string foo = result.Foo; string bar = result.Bar

El nombre del campo devuelto por el resultado será el nombre de la propiedad dinámica.

En su caso, desea devolver una lista y no asignarla a variables individuales, por lo que una tupla sería más apropiada:

string sql = "select id1, id2 from sometable"; List<Tuple<int, int>> result = conn.Query<int, int, Tuple<int, int>>( // *1 sql, Tuple.Create, // *2 splitOn: "*" ) // *3 .AsList(); // *4

* 1 = <int,int, Tuple<int, int>> le dice a Dapper que habrá dos enteros que devolverán un Tuple

* 2 = le dice a Dapper que use una tupla para devolver el resultado

* 3 = le dice a Dapper que cada campo devuelto se usa para devolver un resultado para cada propiedad del Tuple.

* 4 = Método de extensión Dapper para convertir el resultado interno de Dapper en una List ; de forma predeterminada, Dapper devuelve una lista debajo de las cubiertas para que la conversión sea más rápida que la copia a una nueva lista.