我正在尝试使用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上,但因为View中的每个字段必须是唯一的(即CompanyName而不是已存在于tblStaff中的Name)映射到POCO不起作用。
以下是代码:
var sql = @"select * from qryStaff";
var people = _db.Query<Person, Company, Person>(sql, (person, company) => {person.Company = company; return person;}, splitOn: "BreakPoint");
我有什么建议可以解决这个难题吗?我愿意改变我的观点,因为现在我对如何进步感到难过。
答案 0 :(得分:0)
您应该明确列出从您查看的所有字段(没有星号!)以及字段名称不唯一的位置,使用别名进行重复数据删除。作为一个例子:
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查询最佳实践的Here's a decent article。
摘录:
在您的SELECT语句中使用列的显式名称 代码有许多优点。首先,SQL Server只返回 您的应用程序需要的数据,而不是一堆额外的数据 您的应用程序将不会使用。只返回你的数据 需要您优化SQL Server需要做的工作量 收集您需要的所有信息栏。也不通过使用 星号(*)命名法,你也最大限度地减少了数量 发送相关数据所需的网络流量(字节数) 将SELECT语句添加到您的应用程序中。
此外,通过明确命名列,您就绝对了 您的应用程序可能与某些数据库相关的潜在故 您在引用的任何表中可能发生的架构更改 SELECT语句。如果你使用asterick(*)命名法和 有人要在表格中添加新列,您的应用程序会 即使没有,也开始接收这一额外数据列的数据 更改应用程序代码。如果您的申请期待 只返回特定数量的列,然后它将失败 只要有人在你的一个人中添加了一个额外的列 引用表。因此,通过明确命名您的列 SELECT语句您的应用程序将始终获得相同的数量 返回的列,即使有人向其中任何一个添加新列 SELECT语句中引用的表。