मान लें कि आप GUID के एकल कॉलम वाली तालिका भेजना चाहते हैं।
सबसे पहले हमें SqlMetaData जो टेबल (कॉलम) के स्कीमा को दर्शाता है।
नीचे दिया गया कोड दर्शाता है कि GUID का "Id" नामक एक कॉलम 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 सर्वर में, अपना उपयोगकर्ता-परिभाषित तालिका प्रकार बनाएं (मैं उन्हें 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