2016-10-22 57 views
0

我試圖轉換一個方法來使用Dapper存儲過程。但我有什麼事情與var result =...C#從方法中刪除SQL並使用存儲過程和Dapper

public Task<TUser> FindByIdAsync(Guid userId) 
{ 
    var sql = @"SELECT * 
       FROM IdentityUser 
       WHERE UserId = @USERID"; 

    using (var connection = new SqlConnection(_connection)) 
    { 
     var result = connection.Query<TUser, IdentityProfile, TUser>(sql, (user, profile) => { user.Profile = profile; 
          return user; }, 
          new { userId }, splitOn: "UserId").SingleOrDefault(); 

     return Task.FromResult(result); 
    } 
} 

這裏很困惑是我:

public Task<TUser> FindByIdAsync(Guid userId) 
{ 
    using (var connection = new SqlConnection(_connection)) 
    { 
     var param = new DynamicParameters(); 
     param.Add("@UserId", userId); 

     return Task.FromResult(connection.Query("IdentityGetUserById", param, commandType: CommandType.StoredProcedure).SingleOrDefault()); 
    } 
} 
+0

你有問題嗎?它是什麼? –

回答

2

但我什麼回事使用var結果很困惑= .. 。

不必混爲一談,這是簡單的小巧玲瓏功能

讓我解釋一下下面的代碼做什麼:

var result = connection.Query<TUser, IdentityProfile, TUser> 
         (sql, (user, profile) => 
         { 
          user.Profile = profile; 
          return user; 
         }, new { userId }, 
         splitOn: "UserId").SingleOrDefault(); 
  1. 用戶是一個複雜的類型與它
  2. 結果上執行SQL查詢的檔案類型部分是一個組合的表格數據(與列用戶和配置文件),在列UserId處自動分割,然後它表示配置文件類型,填充在用戶類型中,按照邏輯user.Profile = profile
  3. 由於查詢結果爲IEnumerable<TUser>,因此SingleOrDefault叫,如果返回Single record返回數據或返回null
  4. 這是自動綁定,當您運行存儲過程complex types

現在同類型的代碼需要一個標準的機制,IdentityGetUserById,唯一變化通過存儲過程名稱(完成)替換真正的Sql,告訴Dapper您正在執行存儲過程(已完成),您已經使用DynamicParameter綁定參數,該參數也可以是匿名類型。結果將是一個類似的格式,你可以做完全一樣的約束力,請檢查下面的代碼,用很少的修改:

using (var connection = new SqlConnection(_connection)) 
{ 
     var result = connection.Query<TUser, IdentityProfile, TUser> 
     ("IdentityGetUserById", 
     commandType: CommandType.StoredProcedure, 
     (user, profile) => 
         { 
          user.Profile = profile; 
          return user; 
         }, new { userId }, 
         splitOn: "UserId").SingleOrDefault(); 

      return Task.FromResult(result); 
     ); 
} 

事實上,我已刪除Dynamic Parameters和使用的Anonymous type,以確保它是一致的sql代碼

相關問題