2011-07-28 75 views
4
class Person 
    { 
     Address Addr { get; set; } 
     int Age { get; set; } 
    } 

    class Address 
    { 
     string StreetName { get; set; } 
     County Cnty { get; set; } 
    } 

    class County 
    { 
     string CntyName; 
     string CntyCode; 
    } 

這裏是我的存儲過程,它填充數據庫中的數據。嵌套多映射的小巧語法

Create Procedure SpGetAllPersons 
    As 
    Select CntyName, CntyCode, StreetName, Age from Persons 

我試着寫下面短小精悍的查詢,但得到一個異常

DBConn.Query<County, Address , Person, Person> 
    (DomainConstants.SpGetAllPersons, 
    (cnty, address, person) => 
    { 
      address.Cnty = cnty; 
      person.Addr = address; 
      return person; 
    }, 
    commandType: CommandType.StoredProcedure, 
    splitOn: "StreetName, Age").ToList(); 

我試着用下面的概念,但它只返回單個對象。我需要一個人的名單。

 var sql = 
    @"select 
     1 as PersonId, 'bob' as Name, 
     2 as AddressId, 'abc street' as Name, 1 as PersonId, 
     3 as Id, 'fred' as Name 
     "; 
       var personWithAddress = connection.Query<Person, Address, Extra, Tuple<Person, Address, Extra>> 
        (sql, (p, a, e) => Tuple.Create(p, a, e), splitOn: "AddressId,Id").First(); 

在此先感謝。

回答

10

感謝馬克和鮑勃跳上它。我能夠以其他方式解決問題:

DBConn.Query(DomainConstants.SpGetAllPersons, commandType: CommandType.StoredProcedure) 
    .Select(x => new Person 
    { 
     Addr = new Address 
     { 
      Cnty = new County 
      { 
       CntyName = x.CntyName, 
       CntyCode = x.CntyCode 
      }, 
      StreetName = x.StreetName 
     }, 
     Age = x.Age 
    }).ToList(); 
+2

老實說,我沒有看到這個塊的重點。它應該自動映射,這就是精巧的美麗;) – coffekid

-1

好,的例子你只選擇單個行,這樣就不會永遠回報不止一個。但是,Query<T>返回IQueryable<T>。你打電話給.First(),所以你得到一個結果就不足爲奇了。如果您更改陳述的最後一部分以使用.ToList(),則您將獲得每行一個項目的列表。

+0

感謝馬克。如果你看到我寫的查詢,它的末尾有ToList()。最後,我剛纔提到了我可以在Dapper Tests存儲庫上找到的概念。我已經嘗試了ToList(),但我沒有得到預期的對象。我所擁有的只是一個例外。我試圖調試SQLMapper,並在對類進行Desierial化時出錯。 –

+0

@Rakshit如果你給我全部的異常細節,並且你的課程足夠了解它,我可以以誠實的態度幫助更多 –

+0

@Rakshit,並說「一個例外」實際上毫無幫助:)確切的消息(和理想的stacktrace),複製/粘貼逐字逐句解釋等是最好的 –