代码之家  ›  专栏  ›  技术社区  ›  Kieran Senior

使用自定义模型和存储库的多个结果

  •  0
  • Kieran Senior  · 技术社区  · 16 年前

    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到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 回复  |  直到 16 年前
        1
  •  0
  •   Kieran Senior    16 年前

    每次我问一个困扰我好几天的问题,我都会在几分钟内找到答案。不管怎样,这个问题的答案是你必须延长 DataContext 在您的存储库中。如果像我一样,您担心必须在每个控制器中指定连接字符串,那么您可以将存储库类中的构造函数更改为如下所示:

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

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