C# 如何使用查询返回另一个模型中的模型?

C# 如何使用查询返回另一个模型中的模型?,c#,sqlite,dapper,C#,Sqlite,Dapper,我有以下数据库表: 创建表用户 id整数非空主键自动递增唯一, 电子邮件文本不为空, 宠物名称文本不为空, pet_年龄整数不为空 ; 我有以下C模型: 公共类用户 { 公共字符串电子邮件{get;set;} 公共宠物{get;set;} } 公营宠物 { 公共字符串名称{get;set;} 公共整数{get;set;} } 我如何使用正确的宠物信息执行SQLite SELECT*查询以返回用户对象 这就是我所尝试的: 公共静态用户GetUserByEmailstring电子邮件 { 使用var

我有以下数据库表:

创建表用户 id整数非空主键自动递增唯一, 电子邮件文本不为空, 宠物名称文本不为空, pet_年龄整数不为空 ; 我有以下C模型:

公共类用户 { 公共字符串电子邮件{get;set;} 公共宠物{get;set;} } 公营宠物 { 公共字符串名称{get;set;} 公共整数{get;set;} } 我如何使用正确的宠物信息执行SQLite SELECT*查询以返回用户对象

这就是我所尝试的:

公共静态用户GetUserByEmailstring电子邮件 { 使用var con=new-SQLiteConnectionGlobals.DbConnectionString; return con.QueryFirstOrDefault$SELECT*来自用户,其中email=@email COLLATE NOCASE,new { 电子邮件 }; }
但是这对Pet模型不起作用,显然这不是魔术。

从SQL返回的字段必须与您的模型匹配。您可以使用返回查询创建具体对象,然后将其解析为真实对象:

public class UserPetQueryResult
{
    public int Id { get; set; }
    public string Email { get; set; }
    public string PetName { get; set; }
    public int PetAge { get; set; }
}



public static User GetUserByEmail(string email)
{
    using var con = new SQLiteConnection(Globals.DbConnectionString);

     UserPetQueryResult  dbResult = con.QueryFirstOrDefault<UserPetQueryResult>($"SELECT id as Id,email as Email,pet_name as PetName,pet_age as PetAge FROM users WHERE email = @email COLLATE NOCASE", new
        {
            email
        });

    return new User() {
            Email = dbResult.Email,
            Pet = new Pet(){
                Name = dbResult.PetName,
                Age = dbResult.PetAge
            }
        };
}

这就是我使用dynamic的最终结果:

公共静态用户GetUserulong不协调 { 使用var con=new-SQLiteConnectionGlobals.DbConnectionString; var user=con.QueryFirstOrDefault$SELECT*FROM{DbTable},其中discord_id=@discorid,new { 不和谐 }; 如果user==null,则返回null; 返回新用户 { discord=ulonguser.discord\u id, RegistrationTimestamp=longuser.registration\u时间戳, Email=stringuser.Email, Balance=doubleuser.Balance, 利润=新利润 { 净=doubleuser.Net_利润, ATH=doubleuser.ATH\u利润, ATL=doubleuser.ATL\u利润 } }; }
这是一个简单的一对一映射,如下所示:

字符串sql=从{DbTable}中选择*,其中discord_id=@discorid; 使用var connection=new SQLiteConnectionGlobals.DbConnectionString { 连接。打开; var foundUser=connection.QueryFirstOrDefault sql, 用户,宠物=> { user.Pet=Pet; 返回用户; }, splitOn:pet_名称; }
您告诉查询获取用户和宠物并返回用户。将User和Pet分开的数据库列是Pet_name,这意味着Pet_name左侧的所有列都映射到User,Pet_name右侧的列(包括Pet_name)映射到Pet。这取决于您如何将两者结合起来。

肯定有更优雅的解决方案,也许没有?这是最常见的方法。我认为这比你的回答更优雅,你不需要动态的东西。您可以让Dapper为您绘制利润/宠物图。看看我的答案。