首页 > 解决方案 > 使用泛型 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)。有人可以帮我弄这个吗?

标签: c#linqxamaringenerics

解决方案


正如@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");


推荐阅读