Dapper et types anonymes

Est-il possible d’utiliser des types anonymes avec Dapper?

Je peux voir comment vous pouvez utiliser dynamic à savoir

connection.Query(blah, blah, blah) 

est-il alors possible de faire un

 .Select(p=> new { A, B ,C }) 

ou une variation de cela après?

modifier

Je pensais vous montrer comment j’utilise Dapper pour le moment. J’ai tendance à mettre en cache (en utilisant un InMemoryCache) les données, donc je ne fais qu’une grosse requête au début (ce qui est très rapide avec Dapper), puis j’utilise Linq pour sortinger le tout dans mon référentiel.

 using System; using System.Collections.Generic; using System.Configuration; using System.Data.Common; using System.Linq; using Dapper; namespace SomeNamespace.Data { public class DapperDataContext : IDisposable { private readonly ssortingng _connectionSsortingng; private readonly DbProviderFactory _provider; private readonly ssortingng _providerName; public DapperDataContext() { const ssortingng connectionSsortingngName = " DataContextConnectionSsortingng"; _connectionSsortingng = ConfigurationManager.ConnectionSsortingngs[connectionSsortingngName].ConnectionSsortingng; _providerName = ConfigurationManager.ConnectionSsortingngs[connectionSsortingngName].ProviderName; _provider = DbProviderFactories.GetFactory(_providerName); } public IEnumerable MyData1 { get; private set; } public IEnumerable MyData2 { get; private set; } protected ssortingng SqlSelectMyTable1Query { get { return @"SELECT Id, A, B, C from table1Name"; } } protected ssortingng SqlSelectMyTable2Query { get { return @"SELECT Id, A, B, C from table2Name"; } } public void Dispose() { } public void Refresh() { using (var connection = _provider.CreateConnection()) { // blow up if null connection.ConnectionSsortingng = _connectionSsortingng; connection.Open(); var sql = Ssortingng.Join(" ", new[] { SqlSelectMyTable1Query, SqlSelectMyTable2Query }); using (var multi = connection.QueryMultiple(sql)) { MyData1 = multi.Read().ToList(); MyData2 = multi.Read().ToList(); } } } public class MyDataView { public long Id { get; set; } public ssortingng A { get; set; } public ssortingng B { get; set; } public ssortingng C { get; set; } } } } 

InMemoryCache ressemble à ceci

 namespace Libs.Web { public class InMemoryCache : ICacheService { #region ICacheService Members public T Get(ssortingng cacheId, Func getItemCallback) where T : class { var item = HttpRuntime.Cache.Get(cacheId) as T; if (item == null) { item = getItemCallback(); HttpContext.Current.Cache.Insert(cacheId, item); } return item; } public void Clear(ssortingng cacheId) { HttpContext.Current.Cache.Remove(cacheId); } #endregion } public interface ICacheService { T Get(ssortingng cacheId, Func getItemCallback) where T : class; void Clear(ssortingng cacheId); } } 

Voici une autre solution pour utiliser des types anonymes avec dapper:

 public static class DapperExtensions { public static IEnumerable Query(this IDbConnection connection, Func typeBuilder, ssortingng sql) { return connection.Query(sql); } } 

et l’utiliser comme ça:

 var data = connection.Query(() => new { ContactId = default(int), Name = default(ssortingng), }, "SELECT ContactId, Name FROM Contact"); 

Est-il possible d’utiliser des types anonymes avec Dapper?

Bien sûr, voir le remplacement non générique de requête, qui renvoie un IDictionary dynamic IDictionary cet object est un expando qui peut être converti ou auquel on peut accéder à l’aide de la notation par points.

Par exemple:

 var v = connection.Query("select 1 as a, 2 as b").First(); Console.Write("{0} {1}",va, vb) // prints: 1 2 

est-il alors possible de faire un .Select

Bien sûr, vous obtenez un IEnumerable … vous pouvez exécuter tout ce que vous voulez sur cela.

Juste une petite amélioration de la grande solution de Guillaume86:

 public static IEnumerable Query(this IDbConnection connection, Func typeBuilder, ssortingng sql, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null) { return SqlMapper.Query(connection, sql, param, transaction, buffered, commandTimeout, commandType); }