.NET Dapper - 映射计算属性

时间:2017-03-15 11:27:40

标签: c# .net orm dapper

我正在使用Dapper处理.NET项目中的数据库连接。自动列映射效果很好,我还可以将列映射到模型中的不同属性名称。但是,我如何映射计算属性?例如,我的模型是

class User
{
    public int Id {get; set;}
    public string Name {get; set;}
    public bool IsPremiumUser {get; set;}
}

表格是

Id | Name | CreationDate | IsPremiumUser

现在,IsPremiumUser在db中可以为null,但在模型中不能。我希望它由以下逻辑映射:

if (row.IsPremiumUser != null)
{
    model.IsPremiumUser = row.IsPremiumUser;
}
else
{
    model.IsPremiumUser = row.CreationDate < 1.1.2000;
}

换句话说,它的值取决于2列。还有很多情况我想根据某个关系是否存在来设置一个布尔属性。如何处理这些更复杂的映射案例?

2 个答案:

答案 0 :(得分:1)

只需使用SQL查询,它将检查IsPremiumUser字段是否为空并返回创建日期检查结果,如果用户没有设置此标志:

var sql =
    @"SELECT 
        Id,
        Name,
        CASE
            WHEN IsPremiumUser IS NOT NULL
                THEN IsPremiumUser
                ELSE CAST(CASE WHEN CreationDate < '2000-01-01' THEN 1 ELSE 0 END AS BIT)
        END AS IsPremiumUser
        FROM Users";
var users = conn.Query<User>(sql);

其他选项将使用带有手动映射结果的动态查询到用户类:

var sql = @"SELECT Id, Name, CreationDate, IsPremiumUser FROM Users";
var millenium = new DateTime(2000, 1, 1);

var users = conn.Query(sql).Select(row => new User {
       Id = row.Id,
       Name = row.Name,
       IsPremiumUser = row.IsPremiumUser == null
           ? row.CreationDate < millenium
           : row.IsPremiumUser
    });

答案 1 :(得分:0)

另一个选择是建立工厂并让它组装用户:

var userRecords = _connection.Query<UserRecord>("select * from users");   
var users = UserFactory.Build(userRecords);
  • UserRecord类仅用于查询数据
  • 工厂将处理属性映射和动态属性

优点:保持SQL查询没有逻辑。随着时间的推移,工厂更加灵活。

缺点:更多代码