2012-04-18 21 views
2

我正在嘗試使用Dapper進行數據訪問(在ASP.NET MVC3 FWIW中)。我有一個T-SQL視圖(在SQL Server中)是這樣的:使用Dapper從T-SQL視圖填充對象

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上,但因爲視圖中的每個字段必須是唯一的(即公司名稱而不是已存在於tblStaff中的名稱)映射到POCO不起作用。

下面的代碼:

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

任何意見,我怎麼可能會解決這個難題?我願意改變我的觀點,因爲現在我很難理解如何進步。

回答

0

您應該明確列出從您返回的所有字段(無星號!)以及字段名稱不唯一的位置,請使用別名進行重複數據刪除。作爲例子:

SELECT 
    s.ComapnyName 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查詢中的通配符,因爲這樣的問題被引入。 Here's a decent article關於SQL查詢最佳實踐。

摘錄:

使用您的 代碼中的SELECT語句列的顯式名稱具有許多優點。首先,SQL Server僅返回您的應用程序需要的數據,而不是您的應用程序不會使用的一堆附加數據 。通過僅返回 需要的數據,您可以優化SQL Server需要執行的工作量,以便收集所需的所有信息列。此外,通過不使用 星號(*)命名法,您還可以最小化向您的應用程序發送與您的SELECT語句相關聯的數據 所需的網絡流量(字節數)的數量 。

而且通過明確的命名你的專欄,你是絕緣的相關的一些數據庫 模式改變可能發生在你 SELECT語句引用任何表中潛在的故障 您的應用程序。如果您要使用星號(*)命名法,並且有人需要在表中添加新列,那麼即使沒有 ,您的應用程序也會開始接收這些額外數據列的數據,即使沒有 更改您的應用程序代碼。如果您的應用程序期望 只有特定數量的列要返回,那麼只要有人向您的 引用表中的一個添加了附加列,就會失敗 。因此,即使有人在SELECT語句中引用的任何一個 表中添加了新列,通過在您的 SELECT語句中明確命名列,您的應用程序總是會得到相同數量的 列返回的列。

+0

我得到的問題是,我的公司模型有一個名爲'Name'而不是CompanyName的屬性,但爲了在視圖中維護一個唯一的列,我必須使用別名,因此精巧器映射可以'將視圖列映射到POCO屬性。沒有將我的模型屬性重命名爲荒謬的名稱,有沒有解決方案? – 2012-04-24 15:52:44

+0

您可以運行兩個單獨的查詢來填充業務對象。我不確定你有另外的選擇。 – 2012-04-24 16:19:26