c# - 使用泛型 C# 使用 where 子句进行选择
问题描述
我有一个使用 sqlite (sqlite-pcl-net) 与数据库连接的应用程序 (xamarin)。我已经编写了使用特定类从数据库中检索数据的方法。但我对如何使用泛型编写这些感兴趣?
我拥有并且想要使用泛型的方法如下:(导致用户类)
public Task<User> GetUserByIdAsync(int id)
{
return Database.Table<User>().Where(i => i.Id == id).FirstOrDefault();
}
现在我需要同样的,从而产生一个类 T 但 id 保持不变(函数参数保持一个 int)。有人可以帮我弄这个吗?
解决方案
正如@vc 74在评论部分指出的那样,您可以实现一个通用接口或从具有Id
属性的基类继承:
public Task<T> GetUserByIdAsync<T>(int id) where T : BaseEntity
{
return Database.Table<T>().Where(i => i.Id == id).FirstOrDefault();
}
public class User : BaseEntity
{
public int Id {get; set;}
}
或者您可以使用表达式生成器:
public static IQueryable<T> WhereByField<T>(this IQueryable<T> q, string filterField)
{
var param = Expression.Parameter(typeof(T), "p");
var prop = Expression.Property(param, filterField);
var exp = Expression.Lambda(prop, param);
Type[] types = new Type[] { q.ElementType, exp.Body.Type };
var mce = Expression.Call(typeof(Queryable), "where", types, q.Expression, exp);
return q.Provider.CreateQuery<T>(mce);
}
此扩展方法的实现类似于 Database.Table<User>().WhereByField("Id");
:
推荐阅读
- node.js - 为什么我不能将第 11 个角度更新为第 12 个?
- javascript - 在选项单击时反应侧边栏消失
- python - DataBricks 中的拆分问题
- next.js - Nextjs 检测 url 中是否存在语言环境
- c++ - 访问 openCV Mat 的不同值
- python - Countour 图 - 在 Matplotlib 中
- angular - 从 12 到 13 的角度迁移出现错误:无法解构“buildOptions.sourceMap”的属性“样式”,因为它未定义
- c# - 具有线程安全的实体框架
- linker - 如何在 XCode 9 中链接静态库
- java - 仅当从子模块触发时,Maven 构建错误