【发布时间】:2011-09-03 01:52:05
【问题描述】:
Dapper 可以使用匿名类型吗?
我可以看到你如何使用动态,即
connection.Query<dynamic>(blah, blah, blah)
那么是否可以做一个
.Select(p=> new { A, B ,C })
或者之后的一些变化?
编辑
我想我会向您展示我目前是如何使用 Dapper 的。我倾向于缓存(使用 InMemoryCache)数据,所以我只在开始时执行一个大查询(使用 Dapper 非常快),然后我使用 Linq 在我的存储库中对其进行排序。
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 string _connectionString;
private readonly DbProviderFactory _provider;
private readonly string _providerName;
public DapperDataContext()
{
const string connectionStringName = " DataContextConnectionString";
_connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
_providerName = ConfigurationManager.ConnectionStrings[connectionStringName].ProviderName;
_provider = DbProviderFactories.GetFactory(_providerName);
}
public IEnumerable<MyDataView> MyData1 { get; private set; }
public IEnumerable<MyDataView> MyData2 { get; private set; }
protected string SqlSelectMyTable1Query
{
get
{
return @"SELECT Id, A, B, C from table1Name";
}
}
protected string 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.ConnectionString = _connectionString;
connection.Open();
var sql = String.Join(" ",
new[]
{
SqlSelectMyTable1Query,
SqlSelectMyTable2Query
});
using (var multi = connection.QueryMultiple(sql))
{
MyData1 = multi.Read<MyDataView>().ToList();
MyData2 = multi.Read<MyDataView>().ToList();
}
}
}
public class MyDataView
{
public long Id { get; set; }
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
}
}
}
InMemoryCache 看起来像这样
namespace Libs.Web
{
public class InMemoryCache : ICacheService
{
#region ICacheService Members
public T Get<T>(string cacheId, Func<T> 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(string cacheId)
{
HttpContext.Current.Cache.Remove(cacheId);
}
#endregion
}
public interface ICacheService
{
T Get<T>(string cacheId, Func<T> getItemCallback) where T : class;
void Clear(string cacheId);
}
}
【问题讨论】:
-
是的,我有点期待这种事情,但目前我没有得到快乐 var result = multi.Read
().Select((p)=> new {Id = p[ "Id"]}).ToList(); -
const string testsql = @"SELECT Id FROM table ;"; var result = connection.Query(testsql).Select((p) => new { Id = p.Id });
-
如果你真的是指通过 Select,那么它应该几乎可以像写的那样工作,特别是如果你转换属性以便它知道类型。我会在我得到一秒时测试它
-
如果答案对我很重要,我会赞成这个问题,但这不是恕我直言。我想要没有动态中间的匿名类型。在我制作的一个小映射器上,我使用 connection.Query("SELECT * FROM Person").MapTo(() => new { Id = default(int), Name = default(string), Age = default(int?) }) 来声明匿名类型,我喜欢 Dapper 里面的东西 :)
-
嗯,给出的答案是正确的,所以我不明白你不愿意投票。关于你的另一点,我完全同意。