调用存储过程时使用.Include方法

时间:2016-09-02 10:22:25

标签: asp.net-mvc entity-framework stored-procedures

我有一个简单的控制器和视图,它接受用户输入字符串,过滤单个表格并显示结果。

我正在使用存储过程来实现对数据库的搜索。

public ActionResult Search(string searchString)
{
    var DBdata = db.WUI_searchDatabases(null,null,searchString,null,null).ToList<Core_Databases>();
    return View(DBdata);
}

一切都很好。

但是,下一步是显示相关表格中的数据。

从我的研究中,我看到很多例子,如下面的下一个片段,其中使用了'include'。

var courses = db.Courses.Include(c => c.Department);
return View(courses.ToList());

很好,但是我很难看到如何使用存储过程来填充我的Core_Databases而不是LINQ来做同样的事情。

任何提示或指针都很受欢迎 - 似乎与Google一起出现在圈子里!

----------------------------------------------- --------------

所以到目前为止给出了回应,似乎我已经碰到了一堵砖墙。 要发布代码。 我的目标是过滤1个表,但能够显示来自所有3个相关表的结果记录。

TBH我还不确定,如果我想在1个视图中显示,或者使用Partials甚至是View Components。我只是在学习并认为1个视图现在最简单! 所以这个阶段 - 只是'一种'这样做的方式将是一个开始。

表:Core_Databases

    public partial class Core_Databases
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Core_Databases()
    {
        this.Core_Schemas = new HashSet<Core_Schemas>();
    }

    [Key]
    [Column(Order = 0)]
    public int C_id { get; set; }
    public string C_linkedServerName { get; set; }
    public string C_dataServerName { get; set; }
    public string name { get; set; }
    public Nullable<int> database_id { get; set; }
// other ....

    public virtual Core_Servers Core_Servers { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Core_Schemas> Core_Schemas { get; set; }
}

表:Core_Schemas

public partial class Core_Schemas
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Core_Schemas()
    {
        this.Core_Objects = new HashSet<Core_Objects>();
    }

    [Key]
    [Column(Order = 0)]
    public int C_databaseID { get; set; }
    [Key]
    [Column(Order = 1)]
    public int schema_id { get; set; }
    public string name { get; set; }
    public Nullable<int> principal_id { get; set; }

    public virtual Core_Databases Core_Databases { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Core_Objects> Core_Objects { get; set; }
}

控制器:

    public class Core_DatabasesController : Controller
{
    private GBSS_DST_1Entities1 db = new GBSS_DST_1Entities1();

    public ActionResult Search(string searchString)
    {
        var DBdata = db.WUI_searchDatabases(null,null,searchString,null,null).ToList<Core_Databases>();
        return View(DBdata);
    }
}

存储过程:

我现在只使用'玩'SProc,而我看到这一切是如何运作的。 在UI主体可以看到工作之前,开发复杂代码没有意义。 最终版本会更复杂。 例如。在表A中找到一个条目,其中表B中有3个匹配的记录,其中1个具有max(属性)= XYZ ...和另一个表C中的2个匹配记录,如果没有blah bah ...... 这就是为什么我感觉不直接EF + LINQ会是一个好主意。

但看到人们在问 - 这就是我用来测试的东西。 它返回的数据与模型'Core_Databases'

的结构相同
ALTER procedure [MD16].[WUI_searchDatabases](
    @id int = null
    ,@dataServerName nvarchar(128) = null
    ,@name nvarchar(128) = null
    ,@compatability_level tinyint = null
    ,@collation_name nvarchar(128) = null
)
AS
--SET FMTONLY OFF
set nocount on 

DECLARE
    @sql        nvarchar(MAX),                               
    @paramlist  nvarchar(4000)                        

-- Base Query
    SELECT @sql =  '' +
        'SELECT ' + 
            '[_id] as [C_id]
            ,[_linkedServerName] as [C_linkedServerName]
            ,[_dataServerName] as [C_dataServerName]
            ,[name],[database_id],[source_database_id],[owner_sid],[create_date],[compatibility_level],[collation_name],[user_access],[user_access_desc],[is_read_only],[is_auto_close_on],[is_auto_shrink_on],[state],[state_desc],[is_in_standby],[is_cleanly_shutdown],[is_supplemental_logging_enabled],[snapshot_isolation_state],[snapshot_isolation_state_desc],[is_read_committed_snapshot_on],[recovery_model],[recovery_model_desc],[page_verify_option],[page_verify_option_desc],[is_auto_create_stats_on],[is_auto_update_stats_on],[is_auto_update_stats_async_on],[is_ansi_null_default_on],[is_ansi_nulls_on],[is_ansi_padding_on],[is_ansi_warnings_on],[is_arithabort_on],[is_concat_null_yields_null_on],[is_numeric_roundabort_on],[is_quoted_identifier_on],[is_recursive_triggers_on],[is_cursor_close_on_commit_on],[is_local_cursor_default],[is_fulltext_enabled],[is_trustworthy_on],[is_db_chaining_on],[is_parameterization_forced],[is_master_key_encrypted_by_server],[is_published],[is_subscribed],[is_merge_published],[is_distributor],[is_sync_with_backup],[service_broker_guid],[is_broker_enabled],[log_reuse_wait],[log_reuse_wait_desc],[is_date_correlation_on],[is_cdc_enabled],[is_encrypted],[is_honor_broker_priority_on] ' + 
        'FROM MD16.Core_Databases WHERE 1=1 ' 

IF @id IS NOT NULL SELECT @sql += ' AND [_id] = @id';
IF @dataServername IS NOT NULL SELECT @sql += ' AND [_dataServerName] = @dataServerName';
IF @name IS NOT NULL SELECT @sql += ' AND [name] = @name' ;
IF @compatability_level IS NOT NULL SELECT @sql += ' AND [compatability_level] = @compatability_level';
IF @collation_name IS NOT NULL SELECT @sql += ' AND [collation_name] = @collation_name' ;

SELECT @paramlist = '@id     int,                         
                     @dataServerName    nvarchar(128),
                     @name nvarchar(128),
                     @compatability_level tinyint,
                     @collation_name nvarchar(128)'

EXEC sp_executesql @sql, @paramlist,
                    @id, @dataServername, @name, @compatability_level, @collation_name

0 个答案:

没有答案