如何使用查询 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");
}
您告诉查询获取 User
、Pet
和 return 用户。划分User
和Pet
的数据库列是"pet_name",这意味着"pet_name"左边的所有列都映射到user,[=19=右边的列=](包括pet_name)映射到pet。将两者结合起来取决于您。
我有以下数据库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");
}
您告诉查询获取 User
、Pet
和 return 用户。划分User
和Pet
的数据库列是"pet_name",这意味着"pet_name"左边的所有列都映射到user,[=19=右边的列=](包括pet_name)映射到pet。将两者结合起来取决于您。