Должен ли запрос возвращать полный результат DTO или может оставить свойства неназначенными? Запрос определенного набораC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Должен ли запрос возвращать полный результат DTO или может оставить свойства неназначенными? Запрос определенного набора

Сообщение Anonymous »

У меня следующий запрос:

Код: Выделить всё

public class FindPersonQuery : IQuery
{
public int Id { get; set; }
}
Обработчик запросов:

Код: Выделить всё

public class FindPersonQueryHandler : IQueryHandler
{
private readonly SqlConnectionFactory _connectionFactory;

public FindPersonQueryHandler(SqlConnectionFactory connectionFactory)
{
_connectionFactory = connectionFactory ?? throw new ArgumentNullException(nameof(connectionFactory));
}

public Person Handle(FindPersonQuery query)
{
string sqlQuery = $@"
SELECT
Id as {nameof(Person.Id)}
FirstName as {nameof(Person.FirstName)},
LastName as {nameof(Person.LastName)},
Age as {nameof(Person.Age)},
Email as {nameof(Person.Email)},
FROM dbo.Person
WHERE
Id = @Id
";
using (SqlConnection connection = _connectionFactory.GetOpenConnection())
{
return connection.QuerySingleOrDefault
(sqlQuery, new
{
Id = query.Id
});
}
}
}
Результат запроса:

Код: Выделить всё

public class Person : IQueryResult
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
Как можно отметить, все свойства результата запроса назначаются. А что, если клиент хочет получить только определенные столбцы? Например, скажем только электронная почта.
1. Должен ли я сделать отдельный запрос для каждого возвращаемого столбца, например:

Код: Выделить всё

public class Email: IQueryResult
{
public string Email { get; set; }
}

Код: Выделить всё

public class FindPersonEmailQuery : IQuery
{
public int Id { get; set; }
}

Код: Выделить всё

public class FindPersonEmailQueryHandler : IQueryHandler
{
private readonly SqlConnectionFactory _connectionFactory;

public FindPersonQueryHandler(SqlConnectionFactory connectionFactory)
{
_connectionFactory = connectionFactory ?? throw new ArgumentNullException(nameof(connectionFactory));
}

public PersonEmail Handle(FindPersonQuery query)
{

. . . // Query to find Person Email
}
}
2. Должен ли я сделать «общий» запрос, для которого клиент может указать, какие столбцы должны быть возвращены, и вернуть объект Person с некоторыми не заданными свойствами, например:

Код: Выделить всё

public class FindPersonQuery : IQuery
{
public int Id { get; set; }
public List ColumnNamesToReturn { get; set; }
}

Код: Выделить всё

public class Person : IQueryResult
{
public int? Id { get; set; } // Will not be set !
public string FirstName { get; set; } // Will not be set !
public string LastName { get; set; } // Will not be set !
public int Age { get; set; } // Will not be set !!
public string Email { get; set; } // ONLY THIS IS SET !
}
3. Какое-то другое решение, о котором я не знаю.
Мне кажется, что вариант 1 приводит к взрывному росту классов, которые различаются одной или двумя строками кода. Вариант 2 несколько плох, поскольку он не сообщает пользователю, для чего именно предназначены другие неназначенные поля, выбрасывают ли они исключение при попытке доступа к ним? По опыту это антишаблон.
Если возможно, хотелось бы увидеть пример в коде решения.

Подробнее здесь: https://stackoverflow.com/questions/792 ... gned-query
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»