c# - 使用实体映射实现 SQL 包装器
问题描述
我试图在 C# 中为 SQL Server 实现一个包装器。
没有包装器的正常工作流程是将数据提取到datatable
使用中direct SQL query
,然后按名称将列映射到实体中。
但是作为一个包装器,最好接受一个mapping function
描述哪些列映射到可枚举的哪些字段。
所以,像这样:
public class UserInfo
{
public string FirstName{ get; set; }
public string LastName{ get; set; }
}
enumerableList = dbManager.Execute("** sql query **", /* some method to specify mapping */);
然后,可枚举将包含database
由 execute 方法映射的 , 的结果。但我不确定如何指定映射?
即使我这样做了,那么如何处理映射中每一列的不同数据类型?
解决方案
如果我正确理解,你想要这样的东西:
public static List<T> ReadRows<T>(this SqlHelper sql, string query, SqlParameter[]
parameters, Func<SqlDataReader, T> projection)
{
var command = GetSqlCommand(query, CommandType.StoredProcedure, parameters);
return sql.ExecuteReader(command, reader => reader.Select(projection).ToList());
}
并使用如下:
var members = _unitOfWork.SqlHelper.ReadRows("spGetMembersByUserCompanies", parameters, _memberProjection);
readonly Func<SqlDataReader, MemberVm> _memberProjection = (r) => new MemberVm
{
InvitationId = r.Get<int?>("InvitationId"),
UserName = r.Get<string>("UserName"),
RoleName = r.Get<string>("RoleName"),
InvitationStatus = (InvitationStatus)r.Get<int>("InvitationStatus"),
LogoUrl = r.Get<string>("LogoUrl")
};
这是我的一段代码。我希望它开始解决您的问题。
推荐阅读
- angular - firebase onCall 函数响应返回 null
- javascript - 使用 React 使用 chrome 扩展更改已经存在的页面上的内容
- javascript - 碰撞检测的问题是JS画布游戏
- bigdata - 使用 OpenStack 管理大数据虚拟机
- angularjs - Django Rest 框架和 Angularjs 身份验证
- javascript - 如何在正文末尾的 ELEMENTOR 脚本之后加载我的脚本
- python - bluepy.btle.BTLEException:无法执行 mgmt cmd 'scanend'
- jpa - JPA 中的实体是什么?
- java - 在spring websocket中捕获会话ID
- python - 重复数据框的行