You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何抽象数据库访问逻辑,通过泛型复用多模型CRUD操作

解决方案

1. 先定义公共实体接口

所有需要用到泛型CRUD的模型都实现这个接口,统一id属性的定义:

public interface IEntity
{
    int id { get; set; }
}

2. 修改模型类实现接口

(你原示例里User的name属性类型写为int属于笔误,这里修正为string)

class User : IEntity
{
    public int id { get; set; }
    public string name { get; set; }
    public int age { get; set; }
}

class Seller : User
{
    public List<string> products { get; set; }
}

3. 给泛型方法添加对应约束

两个报错都是缺少泛型约束导致的:

  • 报错1是因为SQLite的Table<T>要求T必须为非抽象类、包含公共无参构造,对应加class, new()约束即可
  • 报错2是因为编译器不知道泛型T包含id属性,通过接口约束IEntity明确属性存在

修改后的泛型方法如下:

// 查全表通用方法
public static async Task<List<T>> GetAll<T>() where T : class, new()
{
    await Init();
    return await db.Table<T>().ToListAsync();
}

// 按id查询通用方法(你原代码里的isCustomer参数未使用,可直接删除)
public static async Task<T> GetById<T>(int id) where T : class, IEntity, new()
{
    await Init();
    return await db.Table<T>().Where(x => x.id == id).FirstAsync();
}

调用示例

// 查所有User
var allUsers = await GetAll<User>();
// 查id为5的Seller
var targetSeller = await GetById<Seller>(5);

补充注意:Seller类中的List<string> products属性SQLite无法直接存储,需要额外配置序列化映射为文本类型存储,或者单独拆分为关联表。

内容的提问来源于stack exchange,提问作者Nicoara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 08:33:03