首页 > 解决方案 > 使用实体映射实现 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 方法映射的 , 的结果。但我不确定如何指定映射?

即使我这样做了,那么如何处理映射中每一列的不同数据类型?

标签: c#sql-server

解决方案


如果我正确理解,你想要这样的东西:

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")
    };

这是我的一段代码。我希望它开始解决您的问题。


推荐阅读