I'm following Steve Sanderson's example from this ASP.NET MVC book手动创建模型而不是使用图表工具来为我完成。所以在我的模型命名空间中,我放置一个名为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());
}
This link描述了如何从存储过程返回多个结果集。
[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
时才可用。
资源
答案 0 :(得分:0)
每次我问一个连续几天阻碍我的问题时,我最终会在几分钟内找到答案。无论如何,这个问题的答案是您必须在您的存储库中扩展DataContext
。如果像我一样,你担心必须在每个控制器中指定连接字符串,那么你可以将存储库类中的构造函数更改为:
public ContractsControlRepository()
: base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { }
这样,当您实例化存储库时,已经为您设置了连接,这使您不必担心,并且实际上集中指定连接字符串。扩展DataContext还意味着您可以访问所有受保护的方法,例如用于调用存储过程的ExecuteMethodCall
,如果愿意,还可以返回多个结果集。