Powiedzmy, że chcesz wysłać tabelę z pojedynczą kolumną identyfikatorów GUID.
Najpierw musimy stworzyć strukturę za pomocą SqlMetaData który reprezentuje schemat tabeli (kolumny).
Poniższy kod pokazuje, że jedna kolumna o nazwie „Id” identyfikatora GUID jest typem tabeli parametrów procedury składowanej SQL
var tableSchema = new List<SqlMetaData>(1)
{
new SqlMetaData("Id", SqlDbType.UniqueIdentifier)
}.ToArray();
Następnie utwórz listę rekordów zgodnych ze schematem przy użyciu SqlDataRecord .
Poniższy kod pokazuje, jak dodać elementy do listy przy użyciu utworzonego powyżej schematu. Utwórz nowy SqlDataRecord dla każdego elementu na liście. Zastąp SetGuid odpowiednim typem i Zastąp Guid.NewGuid() jako odpowiednią wartość.Powtórz nowy rekord SqlDataRecord dla każdego elementu i dodaj je do listy
var tableRow = new SqlDataRecord(tableSchema);
tableRow.SetGuid(0, Guid.NewGuid());
var table = new List<SqlDataRecord>(1)
{
tableRow
};
Następnie utwórz 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
};
Następnie po prostu wywołaj procedurę składowaną przy użyciu bazy danych .SqlQuery .
IEnumerable<ReturnType> result;
using (var myContext = new DbContext())
{
result = myContext.Database.SqlQuery<User>("GetUsers @UserIds", parameters)
.ToList(); // calls the stored procedure
// ToListAsync(); // Async
{
W SQL Server utwórz typ tabeli zdefiniowanej przez użytkownika (dodałem do nich TTV, wartość wpisana w tabelę):
CREATE TYPE [dbo].[UniqueidentifiersTTV] AS TABLE(
[Id] [uniqueidentifier] NOT NULL
)
GO
Następnie określ typ jako parametr (nie zapomnij, wartości typu tabeli muszą być tylko do odczytu!):
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