【问题标题】:How do you tell ASP .Net dynamic data to use stored procedures for select?您如何告诉 ASP .Net 动态数据使用存储过程进行选择?
【发布时间】:2009-06-29 18:52:50
【问题描述】:

我看到您可以指定插入、更新和删除存储过程,但对于 SELECT 存储过程没有直接的方法。

【问题讨论】:

  • 您使用的是 LINQ to SQL 还是实体框架?
  • 必须是SP,还是可以是View?
  • 视图将是一个很酷的解决方法,但这是否仍需要我向用户授予选择权限?
  • 是的。我认为就像它是一张桌子/SP一样。
  • 视图如何解决存储过程?两者完全不同,用于完全不同的需求。我认为最好说 VIEW 是针对此特定要求的更好解决方案,而不是解决方法。

标签: asp.net stored-procedures select dynamic-data


【解决方案1】:

您要查找的内容我认为不可能完全,因为实体必须映射到表格或某种视图。存储过程不是您可以针对其定义实体的东西。

但是,当然可以为存储过程创建一个映射,告诉 Linq2Sql 在执行时返回实体,并在 DataContext 类中放置一个方法来运行存储过程并获取实体列表。这些实体的执行方式与从常规表映射创建的实体相同,因此对它们调用 SubmitChanges() 将使用您为该实体类型创建的任何插入/更新/删除存储过程。

可能最好的办法是查看this walkthrough by Scott Guthrie

【讨论】:

    【解决方案2】:

    这是可行的,但不能通过可视化拖放工具。你必须做三件事:

    1. 从 datacontext 类创建一个新方法,该方法将被调用以“获取”您的数据

      public partial class DatabaseDataContext {
      [Function(Name = "dbo.Contact_Get")]
      [ResultType(typeof(Contact))]
      [ResultType(typeof(int))]
      public IMultipleResults GetContacts([Parameter(Name = "PageIndex", DbType = "Int")] System.Nullable<int> pageIndex, [Parameter(Name = "PageSize", DbType = "Int")] System.Nullable<int> pageSize, [Parameter(Name = "Sort", DbType = "NVarChar(10)")] string sort, [Parameter(Name = "ContactTypeId", DbType = "Int")] System.Nullable<int> contactTypeId) {
          IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), pageIndex, pageSize, sort, contactTypeId);
          return ((IMultipleResults)(result.ReturnValue));
      }
      

      }

    2. 为您希望在 CustomPages 文件夹中控制选择的特定表格创建一个新页面模板(例如 List.aspx)。

    3. 控制gridview的选择机制。

      protected void GridDataSource_Selecting(object sender, LinqDataSourceSelectEventArgs e) {
      DatabaseDataContext db = new DatabaseDataContext();
      IMultipleResults results = db.GetContacts(e.Arguments.StartRowIndex, e.Arguments.MaximumRows, e.Arguments.SortExpression, (int?)e.WhereParameters["ContactTypeId"]);
      e.Result = results.GetResult<Contact>().ToList();
      e.Arguments.TotalRowCount = results.GetResult<int>().Single<int>();
      

      }

    查看 DD 的 codeplex 站点上的 Dynamic Data SP 示例,该示例向您展示了如何执行此操作:

    http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=14473

    【讨论】:

    • 这看起来很棒。会调查的。
    • 有人可以帮助更新实体框架的这些说明吗?
    【解决方案3】:

    linq-to-sql 是一个非常糟糕的主意...

    但是这个存储过程应该允许你做你想做的事

    create PROCEDURE [dbo].[usp_GetCompanies] (
        @in_filter nvarchar(2000)
    )
    AS
        declare @sql nvarchar(max)
        begin
            set @sql = '
            SELECT 
                c.id as company_id, c.name as company_name
            FROM company c
            WHERE id is not null ' + @in_filter + ' order by c.type, c.name ' 
            exec sp_executesql @sql
        end
    return
    

    sample

    【讨论】:

    • 我不明白您的建议如何成为解决方案。我想知道我会在哪里指定用于我的 SELECT 语句的存储过程
    • 好的 - 我想我不明白你需要哪一部分。请参阅上面答案中的链接
    • 我想强调的是,仅仅因为可以使用 linq-to-sql,并不意味着你应该使用它。在我管理的环境中明确禁止使用 linq-to-sql。
    猜你喜欢
    • 2016-07-03
    • 1970-01-01
    • 2015-05-12
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2011-10-11
    相关资源
    最近更新 更多