如何使用查询 return 另一个模型中的模型?

How to return a model in an other one using a query?

我有以下数据库table:

CREATE TABLE "users" (
    "id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "email" TEXT NOT NULL,
    "pet_name"  TEXT NOT NULL,
    "pet_age"   INTEGER NOT NULL
);

我有以下 C# 模型:

public class User
{
    public string Email { get; set; }
    public Pet Pet { get; set; }
}

public class Pet
{
    public string Name { get; set; }
    public int Age { get; set; }
}

我如何使用正确的 Pet 信息执行 SQLite SELECT * 查询 return 一个 User 对象?

这是我试过的:

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

    return con.QueryFirstOrDefault<User>($"SELECT * FROM users WHERE email = @email COLLATE NOCASE", new
    {
        email
    });
}

但这不适用于 Pet 模型,显然这不是魔法。

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

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:

public static User GetUser(ulong discordId)
{
    using var con = new SQLiteConnection(Globals.DbConnectionString);

    var user = con.QueryFirstOrDefault<dynamic>($"SELECT * FROM {DbTable} WHERE discord_id = @discordId", new
    {
        discordId
    });

    if (user == null) return null;

    return new User
    {
        DiscordId = (ulong)user.discord_id,
        RegistrationTimestamp = (long)user.registration_timestamp,
        Email = (string)user.email,
        Balance = (double)user.balance,
        Profit = new Profit
        {
            Net = (double)user.net_profit,
            ATH = (double)user.ath_profit,
            ATL = (double)user.atl_profit
        }
    };
}

这是一个简单的一对一映射,如下所示:

string sql = "SELECT * FROM {DbTable} WHERE discord_id = @discordId";

using (var connection = new SQLiteConnection(Globals.DbConnectionString))
{
    connection.Open();

    var foundUser = connection.QueryFirstOrDefault<User, Pet, User>(
            sql,
            (user, pet) =>
            {
                user.Pet = pet;
                return user;
            },
            splitOn: "pet_name");
}

您告诉查询获取 UserPet 和 return 用户。划分UserPet的数据库列是"pet_name",这意味着"pet_name"左边的所有列都映射到user,[=19=右边的列=](包括pet_name)映射到pet。将两者结合起来取决于您。