得到数据上下文存储过程:LINQ to SQL的(Get Stored Procedure from

2019-06-25 23:55发布

我在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的和库

Answer 1:

你可以做这样的事情,称使用反射的方法:

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


Answer 2:

这是一个相当庞大的SOC的断裂有你的资料库中的任何呼叫者知道是否不特定的方法调用会导致读取从文件中的文本,SQL语句,存储过程或甚至只是花园小矮人分型结果出来一个文本终端上。

为此,它于事无补有你的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);
     }

}


Answer 3:

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

public virtual void UpdateBankAccountUsingStoredProcedure()
{
    var results = Context.ParseXML(...);
    ...
}


文章来源: Get Stored Procedure from Data Context : Linq to SQl