2011-05-19 59 views
7
var sql = @"SELECT 
    a.id AS `Id`, 
    a.thing AS `Name`, 
    b.id AS `CategoryId`, 
    b.something AS `CategoryName` 
FROM .."; 

var products = connection.Query<Product, Category, Product>(sql, 
    (product, category) => 
    { 
     product.Category = category; 
     return product; 
    }, 
    splitOn: "CategoryId"); 

foreach(var p in products) 
{ 
    System.Diagnostics.Debug.WriteLine("{0} (#{1}) in {2} (#{3})", p.Name, p.Id, p.Category.Name, p.Category.Id); 
} 

結果:如何爲Dapper中的多映射支持命名列?

'First (#1) in (#0)' 
'Second (#2) in (#0)' 

的CategoryId和類別名稱具有值,因爲下面的

var products = connection.Query(sql).Select<dynamic, Product>(x => new Product 
{ 
    Id = x.Id, 
    Name = x.Name, 
    Category = new Category { Id = x.CategoryId, Name = x.CategoryName } 
}); 

結果:

'First (#1) in My Category (#10)' 
'Second (#2) in My Category (#10)' 

我連接到MySQL數據庫如果與它有任何關係。

+0

您正在使用spliton,您是否介意在Google代碼中向跟蹤器提交破損的測試? – 2011-05-19 12:40:27

+0

@Sam我猜如果我把''CategoryName''改成'Name''它應該可以工作嗎?我的印象是,Dapper會使用一些automapper約定來映射''CategoryName''(也嘗試過''Category.Name'')到'x.Category.Name' – loraderon 2011-05-19 13:07:49

+0

是的,你是對的@loraderon,它不會追加分類到所有道具......實際上它更簡單,只是爲了處理結果集中的重複列名稱。那麼你可以做一些像'select * from posts p加入作者a on p.AuthorId = a.Id'這是很簡潔的 – 2011-05-20 04:55:13

回答

9

最簡單的方法是將它們全部撥打Id(不區分大小寫,所以只需a.idb.id都可以);那麼你可以使用:

public void TestMultiMapWithSplit() 
    { 
     var sql = @"select 1 as Id, 'abc' as Name, 2 as Id, 'def' as Name"; 
     var product = connection.Query<Product, Category, Product>(sql, 
      (prod, cat) => 
      { 
       prod.Category = cat; 
       return prod; 
      }).First(); 
     // assertions 
     product.Id.IsEqualTo(1); 
     product.Name.IsEqualTo("abc"); 
     product.Category.Id.IsEqualTo(2); 
     product.Category.Name.IsEqualTo("def"); 
    } 

如果你不能做到這一點,有一個可選的splitOnstring)參數,需要一個逗號分隔的列清單在拆分處理。

+0

從來沒有想過會這麼容易!謝謝! – loraderon 2011-05-19 11:40:13

+0

@loraderon我們特別懶,我們寫的東西很容易使用; p – 2011-05-19 12:09:05

相關問題