Usar Dapper para poblar objetos desde una vista T-SQL

c# dapper multi-mapping

Pregunta

Estoy probando el uso de Dapper para mi acceso a los datos (en ASP.NET MVC3 FWIW). Tengo una vista de T-SQL (en SQL Server) que es algo como esto:

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

Muy simple. Esencialmente una lista de personal, cada uno de los cuales tiene una sola compañía.

El problema que tengo es que intento mapear el resultado de esta consulta en mis POCOs, pero debido a que cada campo en la Vista debe ser único (es decir, CompanyName en lugar de Name que ya existe en tblStaff) la asignación a POCOs no está funcionando.

Aquí está el código:

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

Algún consejo sobre cómo podría resolver este rompecabezas? Estoy abierto a cambiar mi forma de ver, ya que ahora estoy perplejo sobre cómo progresar.

Respuesta popular

Debe enumerar explícitamente todos los campos devueltos desde su vista (¡sin asteriscos!) Y donde los nombres de los campos no sean únicos, use alias para deduplicar. Como ejemplo:

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

Los campos listados y los alias que puede usar dependen, por supuesto, completamente de su código. Por lo general, ajusta los alias en su consulta para que coincidan con los nombres de propiedad de POCO.

Además, como regla general, es bueno mantenerse alejado de los comodines en las consultas SQL exactamente porque se presentan problemas como este. Aquí hay un artículo decente sobre las mejores prácticas de consulta SQL.

Extracto:

El uso de nombres explícitos de columnas en sus sentencias SELECT dentro de su código tiene varias ventajas. Primero, SQL Server solo está devolviendo los datos que su aplicación necesita, y no un montón de datos adicionales que su aplicación no utilizará. Al devolver solo los datos que necesita, está optimizando la cantidad de trabajo que necesita SQL Server para reunir todas las columnas de información que necesita. Además, al no utilizar la nomenclatura de asterisco (*), también está minimizando la cantidad de tráfico de red (número de bytes) necesario para enviar los datos asociados con su declaración SELECT a su aplicación.

Además, al nombrar explícitamente sus columnas, está aislando su aplicación de posibles fallas relacionadas con algún cambio en el esquema de la base de datos que podría ocurrir en cualquier tabla a la que haga referencia en su declaración SELECT. Si utilizara la nomenclatura asterick (*) y alguien agregara una nueva columna a una tabla, su aplicación empezaría a recibir datos para esta columna de datos adicional, incluso sin cambiar el código de la aplicación. Si su aplicación esperaba que solo se devolviera un número específico de columnas, fallaría tan pronto como alguien agregara una columna adicional a una de sus tablas a las que se hace referencia. Por lo tanto, al nombrar explícitamente las columnas en su declaración SELECT, su aplicación siempre obtendrá el mismo número de columnas devueltas, incluso si alguien agrega una nueva columna a cualquiera de las tablas a las que se hace referencia en su declaración SELECT.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow