Код: Выделить всё
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
}
}
Код: Выделить всё
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 !
}
Мне кажется, что вариант 1 приводит к взрывному росту классов, которые различаются одной или двумя строками кода. Вариант 2 несколько плох, поскольку он не сообщает пользователю, для чего именно предназначены другие неназначенные поля, выбрасывают ли они исключение при попытке доступа к ним? По опыту это антишаблон.
Если возможно, хотелось бы увидеть пример в коде решения.
Подробнее здесь: https://stackoverflow.com/questions/792 ... gned-query