Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET Dapper-映射计算属性_C#_.net_Orm_Dapper - Fatal编程技术网

C# .NET Dapper-映射计算属性

C# .NET Dapper-映射计算属性,c#,.net,orm,dapper,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 现在

我正在使用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,但在模型中不能为null。我希望它通过以下逻辑进行映射:

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

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

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

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

另一种选择是创建工厂并让其组装用户:

var userRecords = _connection.Query<UserRecord>("select * from users");   
var users = UserFactory.Build(userRecords);
UserRecord类仅用于查询数据 工厂将处理属性映射和动态属性 优点:保持SQL查询没有逻辑。随着时间的推移,工厂变得更加灵活


缺点:更多代码

当您尝试将项目保存回数据库时,此映射应如何工作?若在阅读时IsPremiumUser为null,那个么它是否应该被更新并具有值?也许您只需要更新和附加属性,这些属性将被计算,但不会映射到db table?是的,这正是我的意思。这些计算出的值将不会被保存回db。谢谢,我最终使用了这种方法,尽管这并不完全是我想要的。如果我有一些更复杂的映射逻辑,在db端不方便执行,该怎么办?@eko请刷新页面:请记住,Dapper将返回IsPremiumUser标志为null或布尔值。它不会返回可为null的布尔值