3

我在 SQL Server 中有一个名为 ParseXML 的存储过程。我有一个使用 LINQ to SQL 的存储库模式。我需要从存储库层调用存储过程。与GetTable方法不同,我们没有用于数据上下文的GetStoredProcedure方法。在这种情况下我们如何调用存储过程呢?

数据库代码

[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

You can do something like this, calling the method using reflection:

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 });

If you are using c# 4.0, you can do:

var inputXML = GetXML(); 

dynamic dynamicContext = Context;

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

让存储库的任何调用者知道特定方法调用是否会导致从文件、SQL 语句、存储过程中读取文本,甚至只是花园侏儒在文本终端上输入结果,这对 SOC 来说是一个相当大的突破。

Context为此,让您的财产公开无济于事。使用存储库的全部意义在于使消费者免受持久性问题的影响!

由于您似乎非常需要避免使用自定义类型Context,因此您可以省去很多麻烦,只需发出一个直接的老式 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 回答
1

C# 包装器是自定义DataCcontext派生类的一部分。你会这样打电话:

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