Использование Dapper для заполнения объектов из представления T-SQL

Я пытаюсь использовать Dapper для доступа к данным (в ASP.NET MVC3 FWIW). У меня есть представление T-SQL (в SQL Server), что-то вроде этого:

SELECT s.*, c.CompanyId AS BreakPoint c.Name AS CompanyName
FROM tblStaff AS s
INNER JOIN tblCompanies AS c ON c.CompanyId = s.CompanyId

Все довольно просто. По сути список сотрудников, каждый из которых имеет одну компанию.

У меня проблема в том, что я пытаюсь отобразить выходные данные этого запроса на мои POCO, но поскольку каждое поле в представлении должно быть уникальным (т. Е. CompanyName вместо Name, которое уже существует в tblStaff), сопоставление с POCO не работает

Вот код:

var sql = @"select * from qryStaff";
var people = _db.Query<Person, Company, Person>(sql, (person, company) => {person.Company = company; return person;}, splitOn: "BreakPoint");

Любой совет, как я могу решить эту загадку? Я открыт для того, чтобы изменить то, как я делаю взгляды, так как сейчас я в тупике о том, как развиваться.

1 ответ

Вы должны явно перечислить все поля, возвращаемые из вашего представления (без звездочек!), А там, где имена полей не являются уникальными, использовать псевдонимы для дедупликации. В качестве примера:

SELECT 
    s.CompanyName as CompanyName1, 
    s.BreakPoint as BreakPoint1,
    ...
    c.CompanyId AS BreakPoint,
    c.Name AS CompanyName
FROM tblStaff AS s
INNER JOIN tblCompanies AS c ON c.CompanyId = s.CompanyId

Перечисленные поля и псевдонимы, которые вы можете использовать, конечно же, полностью зависят от вашего кода. Обычно вы настраиваете псевдонимы в своем запросе, чтобы они соответствовали именам свойств POCO.

Кроме того, как общее практическое правило, хорошо держаться подальше от подстановочных знаков в SQL-запросах именно потому, что такие проблемы появляются. Вот достойная статья о лучших практиках SQL-запросов.

Выдержка:

Использование явных имен столбцов в ваших инструкциях SELECT в вашем коде имеет ряд преимуществ. Во-первых, SQL Server возвращает только те данные, которые нужны вашему приложению, а не набор дополнительных данных, которые ваше приложение не будет использовать. Возвращая только те данные, которые вам нужны, вы оптимизируете объем работы, которую должен выполнить SQL Server, чтобы собрать все необходимые вам столбцы информации. Кроме того, не используя номенклатуру звездочки (*), вы также минимизируете объем сетевого трафика (количество байтов), необходимый для отправки данных, связанных с вашим оператором SELECT, в ваше приложение.

Кроме того, явно назвав столбцы, вы изолируете свое приложение от потенциальных сбоев, связанных с некоторыми изменениями схемы базы данных, которые могут произойти с любой таблицей, на которую вы ссылаетесь в своем операторе SELECT. Если бы вы использовали звездочку (*), а кто-то должен был добавить новый столбец в таблицу, ваше приложение начнет получать данные для этого дополнительного столбца данных, даже не изменяя код приложения. Если ваше приложение ожидает возврата только определенного числа столбцов, оно завершится неудачно, как только кто-то добавит дополнительный столбец в одну из ваших ссылочных таблиц. Поэтому, явно указав столбцы в вашем операторе SELECT, ваше приложение всегда получит одинаковое количество возвращаемых столбцов, даже если кто-то добавит новый столбец в любую из таблиц, на которые ссылается ваш оператор SELECT.

Другие вопросы по тегам