有很多方法可以将数据库字段名称映射到类名,但是删除下划线的最简单方法是什么?
public IEnumerable<PersonResult> GetPerson(int personId)
{
using (var dbConnection = _dbConnectionFactory.Create(ConnectionStrings.ProjectXYZ))
{
IEnumerable<PersonResult> result =
dbConnection.Query<PersonResult>("fn_get_person", new { personId },
commandType: CommandType.StoredProcedure).ToList();
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
表和数据库字段:
person
--------
person_id
full_name
Run Code Online (Sandbox Code Playgroud)
有效的类:(小巧玲珑已经忽略大写)
public class PersonResult
{
public int Person_Id { get; set; }
public string Full_Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想把课程改为:
public class PersonResult
{
public int PersonId { get; set; }
public string FullName { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 有没有办法使用dapper-dot-net来使用属性来指定应该使用的列名而不是属性名?
public class Code
{
public int Id { get; set; }
public string Type { get; set; }
// This is called code in the table.
public string Value { get; set; }
public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
无论我选择什么,我都希望能够命名我的房产.我们的数据库没有一致的命名约定.
如果没有小巧玲珑,还有其他类似的选择吗?
我已经成功地将今天的东西作为小沙箱/ POC项目运行起来,但似乎在一个问题上让我头疼...
题:
有没有办法让dapper映射到带有空格的SQL列名.
作为我的结果集,我有一些这样的效果.
例如:
SELECT 001 AS [Col 1],
901 AS [Col 2],
00454345345345435349 AS [Col 3],
03453453453454353458 AS [Col 4]
FROM [Some Schema].[Some Table]
Run Code Online (Sandbox Code Playgroud)
我的班级看起来像这样
public class ClassA
{
public string Col1 { get; set; }
public string Col2 { get; set; }
///... etc
}
Run Code Online (Sandbox Code Playgroud)
我的实现目前看起来像这样
public Tuple<IList<TClass>, IList<TClass2>> QueryMultiple<TClass, TClass2>(object parameters)
{
List<TClass> output1;
List<TClass2> output2;
using (var data = this.Connection.QueryMultiple(this.GlobalParameter.RpcProcedureName, parameters, CommandType.StoredProcedure))
{
output1 = data.Read<TClass>().ToList();
output2 = data.Read<TClass2>().ToList();
}
var result = new …Run Code Online (Sandbox Code Playgroud) 我尝试使用列属性映射我的Id字段,但由于某种原因,这似乎不起作用,我无法弄清楚原因.我建立了一个测试项目来展示我正在尝试的东西.
首先,我得到了我的2个实体:
实体表1
using System.Data.Linq.Mapping;
namespace DapperTestProj
{
public class Table1
{
[Column(Name = "Table1Id")]
public int Id { get; set; }
public string Column1 { get; set; }
public string Column2 { get; set; }
public Table2 Table2 { get; set; }
public Table1()
{
Table2 = new Table2();
}
}
}
Run Code Online (Sandbox Code Playgroud)
和实体表2
using System.Data.Linq.Mapping;
namespace DapperTestProj
{
public class Table2
{
[Column(Name = "Table2Id")]
public int Id { get; set; }
public string Column3 { get; set; } …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用带有Dapper和多映射的CTE来获取分页结果.我对重复的列感到不便; 例如,CTE阻止我使用Name列.
我想将以下查询映射到以下对象,而不是列名称和属性之间的不匹配.
查询:
WITH TempSites AS(
SELECT
[S].[SiteID],
[S].[Name] AS [SiteName],
[S].[Description],
[L].[LocationID],
[L].[Name] AS [LocationName],
[L].[Description] AS [LocationDescription],
[L].[SiteID] AS [LocationSiteID],
[L].[ReportingID]
FROM (
SELECT * FROM [dbo].[Sites] [1_S]
WHERE [1_S].[StatusID] = 0
ORDER BY [1_S].[Name]
OFFSET 10 * (1 - 1) ROWS
FETCH NEXT 10 ROWS ONLY
) S
LEFT JOIN [dbo].[Locations] [L] ON [S].[SiteID] = [L].[SiteID]
),
MaxItems AS (SELECT COUNT(SiteID) AS MaxItems FROM Sites)
SELECT *
FROM TempSites, MaxItems
Run Code Online (Sandbox Code Playgroud)
对象:
public class Site
{
public …Run Code Online (Sandbox Code Playgroud) public CodeCustomMapper()
{
Map(f => f.Name).Column("SName");
Map(f => f.Name).Column("TName");
Map(f => f.EmailID).Column("wmail");
Map(f => f.EmailID).Column("Email");
}
Run Code Online (Sandbox Code Playgroud)
我想为dapper.query函数创建这种映射.
请有人帮忙吗?
我想将自定义列名称映射到实体属性名称.
public class EntityBase
{
public string CreatedBy { get; set; }
public DateTime CreatedOn { get; set; }
}
public class Person :EntityBase
{
public string SecurityAlias{ get; set; }
public DateTime Identifier{ get; set; }
}
public class EntityBaseMap
{
public EntityBaseMap()
{
var map = new CustomTypeMap<EntityBase>();
map.Map("CreatingPerson", "CreatedBy");
map.Map("CreatedDate", "CreatedOn");
SqlMapper.SetTypeMap(map.Type, map);
}
}
public class PersonMap
{ …Run Code Online (Sandbox Code Playgroud) 假设我有这User门课:
public class User
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public DateTime DateCreated { get; set; }
public DateTime LastLogin { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想将其映射到下表:
CREATE TABLE "user" (
"ID" int(11) NOT NULL AUTO_INCREMENT,
"FirstName" varchar(45) DEFAULT NULL,
"LastName" varchar(45) DEFAULT NULL,
"Email" varchar(255) NOT NULL,
"DateCreated" int(11) NOT NULL,
"LastLogin" int(11) NOT NULL, …Run Code Online (Sandbox Code Playgroud) 我在存储库中使用Dapper将查询结果映射到我要返回的API的DTO类型列表.一切似乎都正常工作但在查询和映射完成后,列表中填充了正确数量的对象,但所有int属性都为0,字符串为null.我在其他项目中使用了Dapper,并且从未遇到过这种情况.我还验证了数据是正确的,如果我将查询复制到SQL Management Studio,它会给我正确的数据.
这是包含自定义映射逻辑的存储库基类的构造函数.我确认这个代码很受欢迎.
static BaseRepository()
{
SqlMapper.SetTypeMap(typeof(T),
new CustomPropertyTypeMap(
typeof(T), (type, columnName) => type.GetProperties()
.FirstOrDefault(prop => prop.GetCustomAttributes(false)
.OfType<ColumnAttribute>()
.Any(attr => attr.Name == columnName))));
}
Run Code Online (Sandbox Code Playgroud)
以下是填充列表的存储库方法:
public IEnumerable<Dog> GetAll()
{
var dogs = Db.Query<Dog>(@"SELECT Id, Name FROM Dogs");
return dogs;
}
Run Code Online (Sandbox Code Playgroud)
这是我的目标:
[DataContract]
public class Dog
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以我已经确认"狗"变量被填充,但所有Id和Name元素都是0或null.以下是最终的JSON结果:
[
{
Id: 0,
Name: null
},
{
Id: 0,
Name: null
},
{
Id: …Run Code Online (Sandbox Code Playgroud) 我正在尝试Dapper.我喜欢到目前为止所看到的.为了做简单的CRUD,我使用Dapper.rainbow.它工作得很好.但是,仅当表具有名称为Id的标识列时,它才有效.有这样的db是有意义的,但我不能要求在数据库中更改列名只是为了使用Dapper.为了更清楚,我正在使用像Northwind Db这样的数据库.它在Id列中重复了表名.
为了处理这个问题,我更改了Dapper.Rainbow代码如下:
public T Get(TId id,string idColumnName="Id")
{
return database.Query<T>("select * from " + TableName + " where "+idColumnName+" = @id", new { id }).FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来处理这个如列映射/注释或完全不同的东西?
我读过这样的问题
Dapper.Rainbow VS Dapper.Contrib
(我遇到了与Dapper.Contrib类似的小问题,我会另外问一下).
更新 - 不确定答案是否适用于我的Dapper.Rainbow问题(至少,我不知道如何).
提前感谢您的帮助!
我在这门课上遇到了以下挑战:
Public Class MyClass
Property Id As Integer
Property LastName as String
End Class
Run Code Online (Sandbox Code Playgroud)
数据库中对应的数据表有如下字段:
Id (int, not null)
Last-Name (nvarchar(80),null)
所以我需要映射MyClass.LastName到MyClasses.Last-Name并度过一段地狱般的时光......
当我编写自定义插入查询时,一切正常,但我想使用 Dapper 扩展包之一的 .Insert 语句。
我尝试过 Dapper.Contrib,但这会忽略我使用 Dapper.FluentMap 或使用 Dapper 本身的内置方法创建的映射Dapper.SetTypeMap。
我尝试了 Dapper.FastCrud,但我无法弄清楚如何为其配置映射,尽管这个 API 看起来很有前途。
任何人?
我有一个名为'Notes'的sql表,我需要为它添加一个Model:
public class Note
{
public int ID { get; set; }
public string Note { get; set; }
public string UserName { get; set; }
public DateTime Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我遇到了这个Note成员的问题,我不能说它,Note因为成员名称不能与它们的封闭类型相同,更改表也不是一个选项 - 它被另一个生产网站使用.
在项目的要求上,类名必须是一致的 - 名称应该代表sql表的单个实例,例如:Documentstable - > Documentmodel等.
基本上Note表不应该有一个Note列,但就是这样,我必须处理.
有没有办法让成员名称与使用Dapper的SQL列名称不同?
dapper ×10
c# ×8
.net ×2
database ×1
mapping ×1
micro-orm ×1
postgresql ×1
sql ×1
sql-server ×1