Řekněme, že chcete odeslat tabulku s jedním sloupcem GUID.
Nejprve musíme vytvořit strukturu pomocí SqlMetaData který představuje schéma tabulky (sloupců).
Níže uvedený kód ukazuje, že jeden sloupec s názvem "Id" GUID je typ tabulky parametrů uložené procedury SQL
var tableSchema = new List<SqlMetaData>(1)
{
new SqlMetaData("Id", SqlDbType.UniqueIdentifier)
}.ToArray();
Dále vytvoříte seznam záznamů, které odpovídají schématu pomocí SqlDataRecord .
Níže uvedený kód ukazuje, jak přidat položky do seznamu pomocí výše vytvořeného schématu. Vytvořte nový záznam SqlDataRecord pro každou z položek v seznamu. Nahraďte SetGuid odpovídajícím typem a Replace Guid.NewGuid() jako odpovídající hodnotu. Opakujte nový SqlDataRecord pro každou položku a přidejte je do seznamu
var tableRow = new SqlDataRecord(tableSchema);
tableRow.SetGuid(0, Guid.NewGuid());
var table = new List<SqlDataRecord>(1)
{
tableRow
};
Poté vytvořte 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
};
Poté jednoduše zavolejte uloženou proceduru pomocí databáze .SqlQuery .
IEnumerable<ReturnType> result;
using (var myContext = new DbContext())
{
result = myContext.Database.SqlQuery<User>("GetUsers @UserIds", parameters)
.ToList(); // calls the stored procedure
// ToListAsync(); // Async
{
V SQL Server vytvořte svůj uživatelsky definovaný typ tabulky (připojuji je TTV, hodnota zadaná tabulkou):
CREATE TYPE [dbo].[UniqueidentifiersTTV] AS TABLE(
[Id] [uniqueidentifier] NOT NULL
)
GO
Poté zadejte typ jako parametr (nezapomeňte, že hodnoty typu tabulky musí být pouze pro čtení!):
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