我有一个简单的控制器和视图,它接受用户输入字符串,过滤单个表格并显示结果。
我正在使用存储过程来实现对数据库的搜索。
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