Tag: dapper

是否可以使用变量/动态字段集在C#中声明匿名类型?

在C#中,我想弄清楚是否可以声明一个匿名类型,其中字段在运行时才知道。 例如,如果我有一个键/值对列表,我可以根据该列表的内容声明一个匿名类型吗? 我正在使用的具体情况是将参数传递给Dapper,我不知道我将提供多少参数。 List<Tuple> paramList = new List<Tuple>() { new Tuple(“key1”, “value1”), new Tuple(“key2”, “value2”) … }; 我想将此List(或等效的Map)转换为匿名类型,我可以将其作为查询参数传递给Dapper。 理想情况下,如果将以上列表定义为匿名类型,则上面的列表最终会显示如下: new { key1=value1, key2=value2, … } 我在StackOverflow上看到了几个问题,询问在声明它们之后扩展匿名类型(“extendo objects”),或者在创建对象后声明任意字段,但我不需要这样做……我只是需要一次性地动态声明类型。 我怀疑它是否需要一些花哨的反思,如果可能的话。 我的理解是编译器在编译时为引擎定义了一个匿名类的类型,所以如果该类的字段在运行时才可用,我可能会运气不好。 实际上,我的用例实际上与使用“extendo对象”来定义任意字段无关。 或者,如果有人知道将查询参数传递给Dapper的更好方法(而不是声明一个匿名类),我也很想知道这一点。 谢谢! UPDATE 抱歉延迟回到这个! 这些答案都很棒,我希望我能给大家一点。 我最终使用了jbtule的解决方案(由Sam Saffron编辑),将IDynamicParameters传递给Dapper,所以我觉得我必须给他答案。 其他答案也很好,并回答了我提出的具体问题。 我非常感谢大家的时间!

为什么要使用Dapper? 任何人都可以评论Dapper Vs ADO.NET优点和缺点

我想了解一个人真的需要考虑使用Dapper的时间。 另外,我想了解比较Dapper Vs ADO.NET的优点和缺点

如何从Dapper查询而不是默认(T)返回null?

我正在使用Dapper通过存储过程进行一些只读数据库调用。 我有一个查询将返回1行或没有。 我正在使用这样的Dapper: using (var conn = new SqlConnection(ConnectionString)) { conn.Open(); return conn.Query(“API.GetCaseOfficer”, new { Reference = reference }, commandType: CommandType.StoredProcedure).FirstOrDefault(); } 返回的CaseOfficer对象如下所示: public class CaseOfficer { public string Title { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } […]

Dapper和MS Access – 读取工作,写入不起作用

让我们首先解决这个问题:我使用MS Access DB时遇到困难,我无法改变它。 这很好用: using (OleDbConnection conn = ConnectionHelper.GetConnection()) { conn.Open(); var results = conn.Query( “select FirstName from Students where LastName = @lastName”, new { lastName= “Smith” } ); conn.Close(); } 这很好用: using (OleDbConnection conn = ConnectionHelper.GetConnection()) { OleDbCommand cmd = new OleDbCommand( “update Students set FirstName = @firstName, City = @city where LastName = […]

Dapper动态返回类型

我一直在使用dapper.net,它是一个非常好的ORM映射器,它与.Net动态类型很有效但我注意到当dapper从数据库中检索数据时它返回Dapper行类型是否有任何方式我可以返回它在任何其他类型像System.Dynamic.ExpandoObject?

插入带有Dapper错误的IEnumerable 集合,“Dapper不支持类”。

是的, 这里和这里有关于如何使用dapper-dot-net插入记录的问题 。 然而,答案虽然提供了丰富的信息,但似乎并未将我指向正确的方向。 以下是这种情况:将数据从SqlServer移动到MySql。 将记录读入IEnumerable很容易,但我只是没有在插入上获取内容。 首先,’移动记录代码’: // moving data Dim session As New Session(DataProvider.MSSql, “server”, _ “database”) Dim resources As List(Of WTUser) = session.QueryReader(Of WTUser)(“select * from tbl_resource”) session = New Session(DataProvider.MySql, “server”, “database”, _ “user”, “p@$$w0rd”) // *edit* – corrected parameter notation with ‘@’ Dim strInsert = “INSERT INTO tbl_resource (ResourceName, ResourceRate, ResourceTypeID, […]

精致和匿名的类型

是否可以使用Dapper的匿名类型? 我可以看到你如何使用动态ie connection.Query(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 […]

Dapper vs ADO.Net用reflection哪个更快?

我研究了Dapper和ADO.NET,并对两者进行了选择测试,发现有时ADO.NET比Dapper更快,有时会逆转。 我知道这可能是数据库问题,因为我正在使用SQL Server。 据说reflection很慢,我在ADO.NET中使用reflection。 那么有谁能告诉我哪种方法最快? 这就是我编码的内容。 使用ADO.NET DashboardResponseModel dashResp = null; SqlConnection conn = new SqlConnection(connStr); try { SqlCommand cmd = new SqlCommand(“spGetMerchantDashboard”, conn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue(“@MID”, mid); conn.Open(); var dr = cmd.ExecuteReader(); List lstMerProd = dr.MapToList(); List lstMerPay = dr.MapToList(); if (lstMerProd != null || lstMerPay != null) { dashResp = new DashboardResponseModel(); […]

针对entity framework的精巧表现

我是新手使用ORM处理数据库,目前我正在制作一个新项目,我必须决定是否使用Entity Framework或Dapper。 我读了许多文章说Dapper比entity framework更快因此我使用Dapper创建了两个简单的原型项目,另一个使用Entity Framework和一个函数从一个表中获取所有行。 表格架构如下图所示 以及两个项目的代码如下 对于Dapper项目 System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); IEnumerable emplist = cn.Query(@”Select * From Employees”); sw.Stop(); MessageBox.Show(sw.ElapsedMilliseconds.ToString()); entity framework项目 System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); IEnumerable emplist = hrctx.Employees.ToList(); sw.Stop(); MessageBox.Show(sw.ElapsedMilliseconds.ToString()); 经过多次尝试上面的代码只有我第一次运行项目时,dapper代码会更快,在这第一次总是我从entity framework项目得到更好的结果我也尝试了以下关于entity framework项目的声明来阻止懒惰装载 hrctx.Configuration.LazyLoadingEnabled = false; 但是,除了第一次以外,EF的表现仍然相同。 虽然网上的所有文章都相反,但是任何人都可以给出关于EF在这个样本中更快的原因的解释或指导 更新 我已经改变了实体样本中的代码行 IEnumerable emplist = hrctx.Employees.AsNoTracking().ToList(); 使用某些文章中提到的AsNoTracking会停止entity framework缓存,停止缓存之后, 精巧的样本表现更好,(但不是很大的区别)

如何使用Dapper有效地选择聚合对象?

让我们说我有一系列形成聚合的对象。 public class C{ public string Details {get;set;} } public class B{ public string Details {get;set;} public List Items {get;set;} } public class A{ public long ID {get;set;} public string Details {get;set;} public List Items {get;set;} } 使用Dapper,从数据库中的表中填充这些内容的最佳方法是什么(在我的情况下,它是postgres,但这不重要)。 示例中的表几乎是一对一的对象模型。 类的Items属性,表示与每个从属对象的外键关系。 即3个表,A与B具有一对多关系,B与C具有一对多关系。 因此,对于给定的AI ID,我希望我的对象也拥有所有子数据。 我最好的猜测是我应该以某种方式使用QueryMultiple,但我不确定如何做到最好。