2017-02-21 5 views
0

Как использовать automapper в щеголеватый интерфейс (IDbConnection) с SQL запросов

public IEnumerable<voucher> index(string word, string DivisionCode, string yearlabel, int pageno) 
 
     { 
 
      using (IDbConnection dbConnection = Connection) 
 
      { 
 
       var data = dbConnection.Query<fydates>(@"SELECT REPLACE(CONVERT(NVARCHAR(10),fystart,6),' ','-') as fystart, 
 
       REPLACE(CONVERT(NVARCHAR(10),fyend,6),' ','-') as fyend FROM fydates WHERE yearlabel = @yearlabel", 
 
       new { yearlabel = yearlabel }).Single(); 
 

 
       List<voucher> DataQuery = dbConnection.Query<voucher, accounts, division, LockStatus, voucher>(@"SELECT V.id,V.voucherno, 
 
       CASE WHEN V.vouchertype='P' THEN 'Paid' ELSE 'Receipt' END AS vouchertype, 
 
       REPLACE(CONVERT(NVARCHAR(10),V.dated,6),' ','-') AS dated,V.subno,V.amount,COALESCE(V.syscreated,' ') AS syscreated,V.bankcode, 
 
       COALESCE(V.cheqno,' ') AS Cheqno,V.Cheqdate,V.posted,V.currency,A.id as accountsid,A.achead,A.shortname, 
 
       D.id as divisionid,D.divname,D.divncode,L.id as lockstatusid,L.name FROM voucher V 
 
       LEFT JOIN Accounts A ON V.bankcode = A.mainac 
 
       LEFT JOIN divisionmst D ON V.divisionid = D.divncode 
 
       LEFT JOIN LockStatus L ON V.posted=L.Type 
 
       WHERE (V.voucherno + V.Subno+V.cheqno + A.achead + LEFT(yearvoucherno,3) LIKE @word AND 
 
       D.divncode LIKE @DivisionCode) AND (dated BETWEEN @fystart AND @fyend OR dated='31-Mar-49') 
 
       Order By V.id DESC OFFSET @pageno *25 ROWS FETCH NEXT 25 ROWS only", 
 
       (voucher, accounts, division, LockStatus) => 
 
       { 
 
        voucher.accounts = accounts; 
 
        voucher.division = division; 
 
        voucher.LockStatus = LockStatus; 
 
        return voucher; 
 
       }, 
 
       new { word = word, fystart = data.fystart, fyend = data.fyend, DivisionCode = DivisionCode, pageno = pageno - 1 }, 
 
       splitOn: "accountsid, divisionid, lockstatusid").ToList(); 
 
       return DataQuery; 
 
      } 
 
     }

В предыдущем сценарии, я использовал метод отображения с использованием spliton в JOINS запросов, он отлично работал. Но в случае союзных запросов или случая, когда условия я застрял, поскольку я не могу решить, где я должен делить. Как и в приведенном выше описании, следует упомянуть объединение и случай, когда условие i не может решить, где делиться.

ответ

0

Просто добавьте фиктивные столбцы, чтобы помочь Dapper знать, где разделить. Обратите внимание, что если фиктивный столбец равен NULL, связанный объект будет иметь значение null. Также обратите внимание, что фиктивные столбцы не должны существовать на ваших целевых объектах.

select 
--first object 
1 AS Id, 
(1+1) AS APropertyAssociatedToYourFirstObject, 
(1+1) AS ADifferentPropertyAssociatedToYourFirstObject, 

--second object (assuming you are splitting on Id) 
1 AS Id, 
(1+1) AS APropertyAssociatedToYourSecondObject, 
(1+1) AS ADifferentPropertyAssociatedToYourSecondObject 
from YourTable 

Кроме того, выстроив его таким образом, вы сэкономите время от времени.

Смежные вопросы