Tag: dapper

小巧的参数不起作用

我正在尝试使用Dapper orm以下简单查询: var sqlString = new StringBuilder(); sqlString.Append(“select a.acct AccountNumber,”); sqlString.Append(” b.first_name FirstName,”); sqlString.Append(” b.last_name LastName,”); sqlString.Append(” a.rr RrNumber,”); sqlString.Append(” c.addr1 AddressLine1,”); sqlString.Append(” c.addr2 AddressLine2,”); sqlString.Append(” c.addr3 AddressLine3,”); sqlString.Append(” c.addr4 AddressLine4,”); sqlString.Append(” c.addr5 AddressLine5,”); sqlString.Append(” c.addr6 AddressLine6,”); sqlString.Append(” c.addr7 AddressLine7,”); sqlString.Append(” c.addr8 AddressLine8 “); sqlString.Append(“from (pub.mfclac as a left join pub.mfcl as b on a.client=b.client) […]

在Dapper中映射实体

我刚刚开始使用Dapper,我似乎没有找到像将数据映射到数据库中的表一样简单的东西: 我有一个存储过程: CREATE PROCEDURE [dbo].GetUserById (@UserId int) AS begin SELECT UserId,LastName,FirstName,EmailAddress FROM users WHERE UserID = @UserId end go 然后是一个实体: public class User { public int Id { get; set; } public string LastName { get; set; } public string FirstName { get; set; } public string Email { get; set; } } 我的代码中有一个精巧的查询: int […]

用Dapper调用自定义构造函数?

我正在尝试使用Dapper与ASP.NET SQL Membership Provider表进行交互。 我包装了SqlMembershipProvider类,并添加了一个额外的方法来获取MembershipUsers给出一些与我自己的一些自定义表相关的标准。 使用Dapper查询数据时,似乎Dapper首先使用无参数构造函数实例化该类,然后将返回的列“映射”到对象的属性中。 但是,MembershipUser类上的UserName属性没有setter。 从Dapper SqlMapper.cs中的第1417行开始, GetSettableProps()方法只获取可设置的属性。 我试图做一个MultiMap查询来调用构造函数,但问题是传递给查询的对象已经缺少UserName。 我猜我可以修改GetSettableProps()方法,但我不确定它是否可行,或者它是否会影响我现有的代码。 反正我有没有调用MembershipUser类有的自定义构造函数? 或者我是否可以对Dapper做出合理的改变以支持我的情况? ** 更新 ** Marc使用非generics/动态Query()方法的答案是正确的,但对后人来说,这是我在Dapper中引用的方法: static List GetSettableProps(Type t) { return t .GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Select(p => new PropInfo { Name = p.Name, Setter = p.DeclaringType == t ? p.GetSetMethod(true) : p.DeclaringType.GetProperty(p.Name).GetSetMethod(true), Type = p.PropertyType }) .Where(info => info.Setter != […]

如何使用Dapper-dot-net从单个SP映射多个记录

我想在单个存储过程的执行将返回50个多个单独选择的情况下使用Dapper,单个结果集中没有一个会非常宽,最多可能是20或30列。 下面的代码来自Dapper Tests,我想知道这个例子是否是一个很好的原型。 谢谢你,斯蒂芬 public void TestMultiMap() { var createSql = @” create table #Users (Id int, Name varchar(20)) create table #Posts (Id int, OwnerId int, Content varchar(20)) insert #Users values(99, ‘Sam’) insert #Users values(2, ‘I am’) insert #Posts values(1, 99, ‘Sams Post1’) insert #Posts values(2, 99, ‘Sams Post2’) insert #Posts values(3, null, ‘no ones […]

将Dapper与Oracle结合使用

我们使用Oracle作为我们的数据库提供者,并且已经考虑使用底层的Dapper替换我们的一些数据访问层(难以维护,难以合并XSD)和基于存储库的模式。 但是,在与oracle一起使用时,我们遇到了许多问题。 命名参数:这些似乎被忽略,无论何时在查询中使用它,Oracle似乎都会以它所想的任何顺序来解释它们。 SqlMapper返回正确命名的参数,它们在Oracle中无法正确解释 变量的“@”命名约定与oracle命名参数不兼容。 它希望在任何参数前面看到“:” 有没有人以前遇到这个并有任何解决方法?

Dapper中间映射

在我之前的问题中略微更高级的映射:) 表: create table [Primary] ( Id int not null, CustomerId int not null, CustomerName varchar(60) not null, Date datetime default getdate(), constraint PK_Primary primary key (Id) ) create table Secondary( PrimaryId int not null, Id int not null, Date datetime default getdate(), constraint PK_Secondary primary key (PrimaryId, Id), constraint FK_Secondary_Primary foreign key (PrimaryId) references […]

没有调用Dapper TypeHandler.SetValue()

我正在测试Dapper将对象加载/持久化到Oracle数据库,并且为了管理Oracle的Guid存储,我需要一个SqlMapper.TypeHandler 。 从数据库加载Guid列时,会调用Parse方法,但是当我尝试使用Guid参数执行SQL语句时,会出现以下exception: System.ArgumentException未处理; Message = Value不在预期范围内.Source = Oracle.DataAccess。 在调试中,我可以看到我从数据库加载我的类时调用了我的处理程序的Parse()方法,但是SetValue()mdethod却没有。 重现exception的代码如下 CREATE TABLE foo (id RAW (16) NOT NULL PRIMARY KEY, name VARCHAR2 (30) NOT NULL); INSERT INTO foo (id, name) VALUES (SYS_GUID (), ‘Bar’); COMMIT; using System; using System.Linq; using Dapper; using Oracle.DataAccess.Client; namespace Program { public class Foo { public Guid Id { […]

拉开表达式<Func >

我正忙于在Dapper和DapperExtensions之上创建包装器扩展方法。 目前我正在尝试向GetList扩展方法添加过滤,类似于LINQ的Where扩展方法。 我已经看到了这个问题,但似乎我无法实现Marc Gravell所建议的,因为.NET 4.5中没有类型EqualsExpression 。 这是一些演示代码,以帮助解释我的问题: using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Diagnostics; using System.Linq.Expressions; using DapperExtensions; namespace Dapper.Extensions.Demo { public class Program { private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings[“DapperDbContext”].ConnectionString; public static IDbConnection Connection { get { return new SqlConnection(ConnectionString); } } public static void Main(string[] args) { […]

现在有办法将TVP传递给.Net Core上的小巧玲珑吗?

我正在使用.net核心和dapper,第一个没有DataTables,第二个使用它们用于TVP。 我试图将List转换为List ,使用此列表创建一个SqlParameter然后将其转换为DynamicParameter但遗憾的是我得到了: The member of type Microsoft.SqlServer.Server.SqlDataRecord cannot be used as a parameter value UPDATE 在使用IDynamicParameters玩了一下之后,我就开始了。 IEnumerable扩展方法 public static DynamicWrapper toTVP(this IEnumerable enumerable, string tableName, string typeName) { List records = new List(); var properties = typeof(T).GetProperties().Where(p => Mapper.TypeToSQLMap.ContainsKey(p.PropertyType)); var definitions = properties.Select(p => Mapper.TypeToMetaData(p.Name, p.PropertyType)).ToArray(); foreach (var item in enumerable) { var values […]

带有“动态”参数名称的IN语句的Dapper AddDynamicParams

我有这样简单的SQL字符串: “SELECT * FROM Office WHERE OfficeId IN @Ids” 问题是@Ids名称是在编辑器中输入的,所以它可以是任何东西,我的问题是,如果我想传入,比如一个整数数组,它只适用于Dapper,如果我使用: var values = new DynamicParameters(); values.AddDynamicParams(new { Ids = new[] { 100, 101 } }); 但是这需要我知道参数名称是Ids ,而在我的场景中并非如此。 我可以在Dapper中设置一个“动态参数”,其中包含“动态”名称,如下所示: var values = new DynamicParameters(); values.Add(“Ids”, new[] { 100, 101 }); 但是,然后Dapper没有为每个值构造带有单独参数的IN (….) SQL。 有没有办法构建传递给AddDynamicParams的动态对象,但事先设置成员名称和值而不知道名称? 我可以修改Dapper源以适应我的场景,但如果有人知道一个更简单和优雅的解决方案,我会很高兴!