2

使用實體框架我可以從我正在處理的項目的數據庫中的大多數sprocs創建具體類。但是,一些sprocs使用動態SQL,因此沒有爲sproc返回元數據。使用Dapper.Net ORM,如何將存儲過程輸出轉換爲具體類型?

因此,對於一個sproc,我手動創建了一個具體類,現在想要將sproc輸出映射到這個類並返回這種類型的列表。

使用下面的方法,我可以得到對象的集合:

   var results = connection.Query<object>("get_buddies", 
        new { RecsPerPage = 100, 
          RecCount = 0, 
          PageNumber = 0, 
          OrderBy = "LastestLogin", 
          ProfileID = profileID, 
          ASC = 1}, 
         commandType: CommandType.StoredProcedure); 

我的具體類包含

[DataContractAttribute(IsReference=true)] 
[Serializable()] 
public partial class LoggedInMember : ComplexObject 
{ 

    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] 
    [DataMemberAttribute()] 
    public global::System.Int16 RowID 
    { 
     get 
     { 
      return _RowID; 
     } 
     set 
     { 
      OnRowIDChanging(value); 
      ReportPropertyChanging("RowID"); 
      _RowID = StructuralObject.SetValidValue(value); 
      ReportPropertyChanged("RowID"); 
      OnRowIDChanged(); 
     } 
    } 
    private global::System.Int16 _RowID; 
    partial void OnRowIDChanging(global::System.Int16 value); 
    partial void OnRowIDChanged(); 

    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] 
    [DataMemberAttribute()] 
    public global::System.String NickName 
    { 
     get 
     { 
      return _NickName; 
     } 
     set 
     { 
      OnNickNameChanging(value); 
      ReportPropertyChanging("NickName"); 
      _NickName = StructuralObject.SetValidValue(value, false); 
      ReportPropertyChanged("NickName"); 
      OnNickNameChanged(); 
     } 
    } 
    private global::System.String _NickName; 
    partial void OnNickNameChanging(global::System.String value); 
    partial void OnNickNameChanged(); 
    . 
    . 
    . 

而不必通過的結果迭代和輸出參數添加到LoggedInMember對象,我如何實時映射這些數據,以便通過WCF服務返回它們的列表?

如果我嘗試var results = connection.Query<LoggedInMember>("sq_mobile_get_buddies_v35", ...我得到以下錯誤:

System.Data.DataException: Error parsing column 0 (RowID=1 - Int64) ---> System.InvalidCastException: Specified cast is not valid. at Deserialize...

回答

0

對此的解決方案是創建從存儲過程導出與EF一個複雜的對象:

public ProfileDetailsByID_Result GetAllProfileDetailsByID(int profileID) 
    { 
     using (IDbConnection connection = OpenConnection("PrimaryDBConnectionString")) 
     { 
      try 
      { 
       var profile = connection.Query<ProfileDetailsByID_Result>("sproc_profile_get_by_id", 
        new { profileid = profileID }, 
        commandType: CommandType.StoredProcedure).FirstOrDefault(); 

       return profile; 
      } 
      catch (Exception ex) 
      { 
       ErrorLogging.Instance.Fatal(ex);  // use singleton for logging 
       return null; 
      } 
     } 
    } 

在這種情況下,ProfileDetailsByID_Result是,我使用手動創建的對象通過複雜類型創建過程(右鍵單擊模型圖,選擇添加/複雜類型...或使用RHS上的複雜類型樹)。

小心

由於這種對象的屬性是從存儲過程導出的一個字,EF無法知道如果一個屬性可爲空的方式。對於任何可空屬性類型,,您必須通過選擇屬性並將它的Nullable屬性設置爲true來手動配置這些

1

在猜測你的SQL列是bigint(即Int64又名long),但你的.NET類型有正的Int16特性。

你可以玩的轉換,並通過執行類似忽略存儲過程:

var results = connection.Query<LoggedInMember>("select cast(9 as smallint) [RowID] ..."); 

如果你只是選擇你想回到你的對象的屬性和類型。 (smallint是SQL等效的Int16的)

相關問題