我正在使用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列。还有很多情况我想根据某个关系是否存在来设置一个布尔属性。如何处理这些更复杂的映射案例?
答案 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);
优点:保持SQL查询没有逻辑。随着时间的推移,工厂更加灵活。
缺点:更多代码