如何创建泛型函数/属性从DataContext中获取数据表?
用泛型简化DataContext数据表获取
嘿,我完全懂你想把那些重复的GetTable调用整合起来的需求——泛型简直就是为这种重复代码场景量身定做的!
先看看你现在可能的代码样子(应该是类似这样的重复属性):
public class MyDataContext : DataContext { // 每个实体对应一个单独的属性,重复代码超多 public Table<User> Users => GetTable<User>(); public Table<Product> Products => GetTable<Product>(); public Table<Order> Orders => GetTable<Order>(); // 新实体加进来就得再加一行... }
下面给你两种泛型实现方案,按需选择:
方案1:在自定义DataContext里添加泛型方法
直接在你的DataContext子类里写一个泛型方法,一次性搞定所有实体的表获取:
public class MyDataContext : DataContext { // 泛型方法,约束实体为引用类型(Linq to SQL要求) public Table<TEntity> GetEntityTable<TEntity>() where TEntity : class { return GetTable<TEntity>(); } }
使用方式
以后获取数据表就不用再依赖一个个单独的属性了,直接指定实体类型就行:
using (var context = new MyDataContext()) { var users = context.GetEntityTable<User>(); var products = context.GetEntityTable<Product>(); // 新增实体直接这么用,不用改DataContext代码 var customers = context.GetEntityTable<Customer>(); }
方案2:扩展方法(全局可用)
如果你想让所有DataContext实例都能用上这个泛型能力,可以写个扩展方法:
public static class DataContextTableExtensions { public static Table<TEntity> GetEntityTable<TEntity>(this DataContext context) where TEntity : class { return context.GetTable<TEntity>(); } }
使用方式
不管是自定义的MyDataContext还是原生DataContext,都能直接调用:
using (var context = new MyDataContext()) { var orders = context.GetEntityTable<Order>(); }
关键注意点
- 必须加上
where TEntity : class约束:因为Linq to SQL的GetTable<T>要求实体类型是引用类型,否则会编译报错。 - 这种方式完全替代了原来的重复属性:以后新增实体时,再也不用手动在
DataContext里加新的属性了,直接调用泛型方法即可,维护成本大大降低。
内容的提问来源于stack exchange,提问作者Exon02
相关产品推荐
相关产品推荐

