Выбор с помощью предложения where с использованием шаблонов C# - PullRequest
1 голос
/ 07 апреля 2020

У меня есть приложение (xamarin) с подключением к базе данных с использованием sqlite (sqlite-pcl- net). Я написал свои методы для извлечения данных из базы данных, используя определенные классы c. Но меня интересует, как их написать с использованием обобщений?

У меня есть метод, с которым я хочу использовать обобщение: (приводит к классу пользователя)

public Task<User> GetUserByIdAsync(int id)
{
    return Database.Table<User>().Where(i => i.Id == id).FirstOrDefault();
}

Теперь мне нужно иметь то же самое, в результате чего получается класс T, но идентификатор остается прежним (параметр функции сохраняет целое число). Может ли кто-нибудь помочь мне с этим?

1 Ответ

3 голосов
/ 07 апреля 2020

Как указано @ v c 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;}
}

Или вы можете использовать Expression Builder :

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");:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...