使用Dapper从T-SQL视图填充对象

时间:2012-04-18 16:02:56

标签: c# dapper multi-mapping

我正在尝试使用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");

我有什么建议可以解决这个难题吗?我愿意改变我的观点,因为现在我对如何进步感到难过。

1 个答案:

答案 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语句中引用的表。