3

SQL Server に ParseXML という名前のストアド プロシージャがあります。LINQ to SQL を使用したリポジトリ パターンがあります。リポジトリ レイヤー内からストアド プロシージャを呼び出す必要があります。GetTableメソッドとは異なり、データ コンテキスト用のGetStoredProcedureメソッドはありません。このようなシナリオでストアド プロシージャを呼び出すにはどうすればよいでしょうか。

DBML コード

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.ParseXML")]

    public ISingleResult<ParseXMLResult> ParseXML([global::System.Data.Linq.Mapping.ParameterAttribute(Name="InputXML", DbType="Xml")] System.Xml.Linq.XElement inputXML)
    {
        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), inputXML);
        return ((ISingleResult<ParseXMLResult>)(result.ReturnValue));
    }

リポジトリ層

namespace RepositoryLayer
{
public interface ILijosBankRepository
{
    System.Data.Linq.DataContext Context { get; set; }
    List<DBML_Project.BankAccount> GetAllAccountsForUser(int userID);
    void UpdateBankAccountUsingStoredProcedure();

}

public class LijosSimpleBankRepository : ILijosBankRepository
{
    public System.Data.Linq.DataContext Context
    {
        get;
        set;
    }


    public List<DBML_Project.BankAccount> GetAllAccountsForUser(int userID)
    {
        IQueryable<DBML_Project.BankAccount> queryResultEntities = Context.GetTable<DBML_Project.BankAccount>().Where(p => p.AccountOwnerID == userID);
        return queryResultEntities.ToList();
    }


    public virtual void UpdateBankAccountUsingStoredProcedure()
    {
        //Context.GetStroedProcedures();
    }

}

}

参照:

  1. 複数の UnitOfWorks、ISession、リポジトリ
4

3 に答える 3

2

特定のメソッド呼び出しがファイル、SQL ステートメント、sprocs、または庭のノームのタイピング結果からテキスト端末に出力されるかどうかを、リポジトリの呼び出し元が認識できるようにすることは、SOC のかなり大きなブレークです。

Contextそのためには、あなたの財産を公開しても問題はありません。リポジトリを使用することの要点は、コンシューマが永続性の問題から保護されるようにすることです!

カスタム型の の使用を避ける必要性が強いように思われるので、Context多くの手間を省き、sproc を実行する単純な昔ながらの SQL ステートメントを発行するだけです。

インターフェイスとロジックを次のようにリファクタリングすることを検討してください。

public interface ILijosBankRepository
{
    List<DBML_Project.BankAccount> GetAllAccountsForUser(int userID);
    void UpdateBankAccount(/* params go here */);
    /* ...other query methods, etc... */

}
public class LijosBankRepository : ILijosBankRepository
{
     private readonly DataContext context { get; set;}
     public LijosBankRepository(DataContext ctx) { ... }

     public void UpdateBankAccount(string inputXml)
     {
          context.ExecuteCommand("ParseXML", inputXml);
     }

}
于 2012-07-11T21:10:48.110 に答える
2

リフレクションを使用してメソッドを呼び出すと、次のようなことができます。

var inputXML = GetXML(); 

var method = Context.GetType().GetMethod("ParseXML");

if(method == null) throw new InvalidOperationException("Defined DataContext does not have method ParseXML");

var result = method.Invoke(Context, new object[]{ inputXML });

c# 4.0 を使用している場合は、次のことができます。

var inputXML = GetXML(); 

dynamic dynamicContext = Context;

var result = (ISingleResult<ParseXMLResult>)dynamicContext.ParseXML(inputXML);
于 2012-07-03T13:48:04.917 に答える
1

C# ラッパーは、カスタムDataCcontext派生クラスの一部です。次のように呼び出します。

public virtual void UpdateBankAccountUsingStoredProcedure()
{
    var results = Context.ParseXML(...);
    ...
}
于 2012-07-03T12:58:32.870 に答える