IMul​​tipleResults使用自定义模型&知识库

时间:2009-07-29 13:17:05

标签: asp.net-mvc linq

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时才可用。

资源

Guy Berstein's Blog

1 个答案:

答案 0 :(得分:0)

每次我问一个连续几天阻碍我的问题时,我最终会在几分钟内找到答案。无论如何,这个问题的答案是您必须在您的存储库中扩展DataContext。如果像我一样,你担心必须在每个控制器中指定连接字符串,那么你可以将存储库类中的构造函数更改为:

public ContractsControlRepository()
      : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { }

这样,当您实例化存储库时,已经为您设置了连接,这使您不必担心,并且实际上集中指定连接字符串。扩展DataContext还意味着您可以访问所有受保护的方法,例如用于调用存储过程的ExecuteMethodCall,如果愿意,还可以返回多个结果集。