Да приемем, че искате да изпратите таблица с една колона от GUID.
Първо трябва да създадем структура, използвайки SqlMetaData който представлява схемата на таблицата (колони).
Кодът по-долу демонстрира, че една колона с име „Id“ на GUID е тип таблица с параметри на SQL съхранена процедура
var tableSchema = new List<SqlMetaData>(1)
{
new SqlMetaData("Id", SqlDbType.UniqueIdentifier)
}.ToArray();
След това създавате списък със записи, които съответстват на схемата, като използвате SqlDataRecord .
Кодът по-долу демонстрира как да добавите елементи в списък, като използвате създадената по-горе схема. Създайте нов SqlDataRecord за всеки от елементите в списъка. Заменете SetGuid със съответния тип и заменете Guid.NewGuid() като съответната стойност. Повторете нов SqlDataRecord за всеки елемент и ги добавете към списък
var tableRow = new SqlDataRecord(tableSchema);
tableRow.SetGuid(0, Guid.NewGuid());
var table = new List<SqlDataRecord>(1)
{
tableRow
};
След това създайте SqlParameter :
var parameter = new SqlParameter();
parameter.SqlDbType = SqlDbType.Structured;
parameter.ParameterName = "@UserIds"; //@UserIds is the stored procedure parameter name
parameter.TypeName = "{Your stored procedure type name}"
parameter.Value = table;
var parameters = new SqlParameter[1]
{
parameter
};
След това просто извикайте съхранената процедура, като използвате база данни .SqlQuery .
IEnumerable<ReturnType> result;
using (var myContext = new DbContext())
{
result = myContext.Database.SqlQuery<User>("GetUsers @UserIds", parameters)
.ToList(); // calls the stored procedure
// ToListAsync(); // Async
{
В SQL Server създайте своя дефиниран от потребителя тип таблица (аз добавям суфикс към тях с TTV, стойност на въведена таблица):
CREATE TYPE [dbo].[UniqueidentifiersTTV] AS TABLE(
[Id] [uniqueidentifier] NOT NULL
)
GO
След това посочете типа като параметър (не забравяйте, че стойностите на типа таблица трябва да са само за четене!):
CREATE PROCEDURE [dbo].[GetUsers] (
@UserIds [UniqueidentifiersTTV] READONLY
) AS
BEGIN
SET NOCOUNT ON
SELECT u.* -- Just an example :P
FROM [dbo].[Users] u
INNER JOIN @UserIds ids On u.Id = ids.Id
END