Giả sử bạn muốn gửi một bảng với một cột GUID.
Trước tiên, chúng ta cần tạo một cấu trúc bằng cách sử dụng SqlMetaData đại diện cho lược đồ của bảng (cột).
Đoạn mã dưới đây minh họa một cột có tên "Id" của GUID là loại bảng tham số thủ tục được lưu trữ trong SQL
var tableSchema = new List<SqlMetaData>(1)
{
new SqlMetaData("Id", SqlDbType.UniqueIdentifier)
}.ToArray();
Tiếp theo, bạn tạo danh sách các bản ghi phù hợp với lược đồ bằng cách sử dụng SqlDataRecord .
Đoạn mã dưới đây trình bày cách thêm các mục bên trong danh sách bằng cách sử dụng lược đồ đã tạo ở trên. Tạo một SqlDataRecord mới cho từng mục trong danh sách. Thay thế SetGuid bằng loại tương ứng và thay thế Guid.NewGuid () làm giá trị tương ứng. Lặp lại SqlDataRecord mới cho từng mục và thêm chúng vào Danh sách
var tableRow = new SqlDataRecord(tableSchema);
tableRow.SetGuid(0, Guid.NewGuid());
var table = new List<SqlDataRecord>(1)
{
tableRow
};
Sau đó, tạo 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
};
Sau đó, chỉ cần gọi thủ tục được lưu trữ bằng cách sử dụng Cơ sở dữ liệu .SqlQuery .
IEnumerable<ReturnType> result;
using (var myContext = new DbContext())
{
result = myContext.Database.SqlQuery<User>("GetUsers @UserIds", parameters)
.ToList(); // calls the stored procedure
// ToListAsync(); // Async
{
Trong SQL Server, hãy tạo Loại bảng do người dùng xác định của bạn (tôi đặt chúng bằng TTV, Giá trị được nhập theo bảng):
CREATE TYPE [dbo].[UniqueidentifiersTTV] AS TABLE(
[Id] [uniqueidentifier] NOT NULL
)
GO
Sau đó, chỉ định kiểu làm tham số (đừng quên, Giá trị Loại Bảng phải được chỉ đọc!):
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