[英]IMultipleResults Using Custom Model & Repository
我正在從這本ASP.NET MVC書中遵循Steve Sanderson的示例,該示例是關於手動創建模型的,而不是使用圖表工具為我完成。 因此,在模型名稱空間中,我放置了一個名為MySystemModel
類,並在其中添加了以下內容
[Table(Name="tblCC_Business")]
public class Business
{
[Column(IsPrimaryKey=true, IsDbGenerated=false)]
public string BusinessID { get; set; }
// this is done because Business column and Business have interfering names
[Column(Name="Business")] public string BusinessCol { get; set; }
}
這部分都很好。 但是問題是從存儲過程返回多個結果集,但是將SQL與LINQ建模混合並匹配。 我們這樣做是因為LINQ to SQL轉換對於我們的某些查詢而言太慢了(在這里爭論這一點確實沒有意義,這是一項業務需求)。 因此,基本上,我在“存儲庫”中使用實際的SQL語句以及LINQ模型,如下所示:
public IEnumerable<MyType> ListData(int? arg)
{
string query = "SELECT * FROM MyTable WHERE argument = {0}";
return _dc.ExecuteQuery<MyType>(query, arg);
//c.GetTable<MyType>(); <-- this is another way of getting all data out quickly
}
現在,我遇到的問題是如何在不擴展DataContext的情況下返回多個結果集,如下所示:
public ContractsControlRepository()
{
_dc = new DataContext(ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString());
}
該鏈接描述了如何從存儲過程中返回多個結果集。
[Function(Name="dbo.VariableResultShapes")]
[ResultType(typeof(VariableResultShapesResult1))]
[ResultType(typeof(VariableResultShapesResult2))]
public IMultipleResults VariableResultShapes([Parameter(DbType="Int")] System.Nullable<int> shape)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), shape);
return ((IMultipleResults)(result.ReturnValue));
}
那么,如何將其轉換為可供存儲庫使用的內容? 我只需要能夠從包含DataContext的存儲庫中返回多個結果集,並且不對其進行擴展。 如果像我一樣將以前的摘錄復制並粘貼到存儲庫中,它將僅說明ExecuteMethodCall
不可用,但這僅在擴展DataContext
可用。
資源資源
每次我問了一個連續幾天困擾我的問題,我最終都在幾分鍾之內找到了答案。 無論如何,此問題的答案是您必須在存儲庫中擴展DataContext
。 如果像我一樣,您擔心必須在每個控制器中都指定連接字符串,則可以將存儲庫類中的構造函數更改為以下形式:
public ContractsControlRepository()
: base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { }
這樣,當您實例化存儲庫時,就已經為您建立了連接,這使您不必擔心,實際上集中了指定連接字符串。 擴展DataContext還意味着您可以訪問所有受保護的方法,例如ExecuteMethodCall
,該方法用於調用存儲過程並(如果願意)帶回多個結果集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.