GUIDの単一の列を持つテーブルを送信するとします。
まず、 SqlMetaData これは、テーブル(列)のスキーマを表します。
次のコードは、GUIDの「Id」という名前の1つの列が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