簡體   English   中英

從數據上下文獲取存儲過程:Linq到SQl

[英]Get Stored Procedure from Data Context : Linq to SQl

我在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和存儲庫

您可以執行以下操作,使用反射調用方法:

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

讓你的存儲庫的任何調用者知道特定的方法調用是否導致從文件,SQL語句,sprocs甚至只是在文本終端輸入結果的花園侏儒中讀取文本,這是SOC的一個非常大的突破。

為此,將Context屬性公開無關緊要。 使用存儲庫的重點是讓消費者免受持久性問題的困擾!

由於您似乎非常需要避免使用自定義類型的Context ,因此您可以省去很多麻煩,只需發出一個直接的,舊式的SQL語句來執行您的sproc。

考慮重構您的界面和邏輯,看起來更像這樣:

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

}

C#包裝器是自定義DataCcontext派生類的一部分。 你會這樣打電話:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM