2

Entity Frameworkの使用私が取り組んでいるプロジェクトのデータベースにあるほとんどのsprocsから具体的なクラスを作成できます。しかし、ストアドプロシージャのいくつかは、動的SQLを使用し、そのように何のメタデータは、SPROCをのために返されません。は、どのように私はコンクリートの型にストアドプロシージャの出力をキャストしていますか?

私は具体的なクラスを手動で作成しましたが、今はsproc出力をこのクラスにマップしてこのタイプのリストを返したいと思います。以下の方法を使用して

私は、オブジェクトのコレクションを取得することができます:私の具体的なクラスは、結果を反復処理し、LoggedInMemberオブジェクトに出力パラメータを追加することなく

[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(); 
    . 
    . 
    . 

が含まれてい

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

をどのようにWCFサービスを介してそれらのリストを返すことができるので、私はこれらを即座にマップするのですか?私はvar results = connection.Query<LoggedInMember>("sq_mobile_get_buddies_v35", ...をしようとした場合

私は次のエラーを取得:あなたのSQLを推測コラムで

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

答えて

0

smallintInt16のSQLと等価である)、この解決策は、EFでSPROC由来する複雑なオブジェクトを作成することであった。この場合

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私は手動で使用して作成されたオブジェクトであります複雑なタイプの作成プロセス(モデルダイアグラムを右クリックし、[Add/Complex Type ...]を選択するか、またはRHSの[Complex Types]ツリーを使用して)を選択します。

このオブジェクトのプロパティは、SPROCから誘導されるので注意の言葉は、EFは、プロパティがNULL可能であるかどうかを知る方法がありません。 null可能なプロパティタイプの場合はを入力してプロパティを選択し、Nullableプロパティをtrueに設定することで、を手動で設定する必要があります。

1

bigint(すなわちInt64long別称)が、あなたのネットタイプはプロパティInt16型のnを持っています。

あなたは、変換で遊んでとのようなものを実行して、ストアドプロシージャを無視することができます:

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

あなたがちょうどあなたがあなたのオブジェクトを返すようにしたいプロパティと種類を選択しているところ。

関連する問題