Пишу REST API сервер на ASP.NET Core 2.1. В качестве ORM хочу использовать Dapper. Ранее разрабатывал лишь небольшие десктоп проекты для работы с БД.
Есть класс, соответствующий таблице в базе:
public class User
{
public int id { get; set; }
public string FIO { get; set; }
public int age { get; set; }
public string city { get; set; }
public string somedata1 { get; set; }
public string somedata2 { get; set; }
public string somedata3 { get; set; }
}
Интрефейс:
public interface IUser
{
IEnumerable<User> GetUsers();
IEnumerable<User> GetSomeData1();
IEnumerable<User> GetSomeData2();
}
Класс, его реализующий:
public class UserRepository : IUser
{
/* ... */
public IEnumerable<User> GetUsers()
{
using (IDbConnection connection = GetConnection())
{
return connection.Query<User>("select id, fio, age, city, somedata1, somedata2, somedata3 from users");
}
}
}
В классе контроллера использую метод из UserRepository:
[HttpGet]
public IEnumerable<User> GetUsers()
{
return _userRepository.GetUsers();
}
Получаю примерно такой JSON-ответ:
[{"id":1, "fio":"Иванов И. И.", "age":10, "city":"dc", "somedata1":"data1", "somedata2":"data2", "somedata3":"data3"}]
Хорошо. Как мне теперь реализовать метод GetSomeData1(), чтобы в JSON возвращать только те поля таблицы, которые я выберу в запросе? Не создавать же на каждый метод по несколько вариаций класса-сущности из базы?
Например, чтобы код:
public IEnumerable<User> GetSomeData1()
{
using (IDbConnection connection = GetConnection())
{
return connection.Query<User>("select id, fio, somedata3 from users where id in (1,2)");
}
}
вернул
[{"id":1, "fio":"Иванов И. И.", "somedata3":"data3"},
{"id":2, "fio":"Петров А. А.", "somedata3":null}]
вместо
[{"id":1, "fio":"Иванов И. И.", "age":null, "city":null, "somedata1":null, "somedata2":null, "somedata3":"data3"},
{"id":2, "fio":"Петров А. А.", "age":null, "city":null, "somedata1":null, "somedata2":null, "somedata3":null}]
Находил вариант с использованием атрибута
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
на поле класса-сущности, но, похоже, такой способ мне не подойдет, т.к. необходимо будет в том числе возвращать JSON с Null-полями.