0

Ich habe eine DB-Funktion, die einen Tabellenwertparameter als Argument (@c) benötigt.EF 6.x und Funktion mit Tabellenwert-Parameter

CREATE TABLE Test 
(
    CD varchar(10) not null 
) 
GO 

INSERT INTO Test VALUES ('TEST') 
GO 

CREATE TYPE [CdTable] AS TABLE (CD varchar(10)); 
GO 

CREATE FUNCTION TestTbl (@x varchar(10), @c CdTable READONLY) 
RETURNS TABLE 
AS 
RETURN 
    SELECT t.CD 
    FROM test t 
    JOIN @c c ON t.CD = c.CD OR c.CD IS NULL 
    WHERE t.CD = @x 
GO 

DECLARE @tt AS CdTable; 
INSERT INTO @tt VALUES ('TEST'); 
SELECT * FROM TestTbl('TEST', @tt); 

DELETE FROM @tt; 
INSERT INTO @tt VALUES (NULL); 
SELECT * FROM TestTbl('TEST', @tt); 
GO 

Die Funktion vom EF Designer (Datenbank zuerst), da dies in der DbContext gebaut:

[DbFunction("MyDbContext", "TestTbl")] 
    public virtual IQueryable<TestTbl_Result> TestTbl(Nullable<System.String> x) 
    { 
     var xParameter = user.HasValue ? 
      new ObjectParameter("x", x) : 
      new ObjectParameter("x", typeof(System.String)); 

     return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<TestTbl_Result>("[MyDbContext].[TestTbl](@x)", xParameter); 
    } 

Wenn ich diese Funktion nur die x verfügbar vorbei rufen/@ x Parameter bekomme ich diese Ausnahme :

Ich weiß nicht, wie Sie den Parameter @c an die Funktion übergeben. Jeder kann helfen?

Vielen Dank im Voraus.

P. S .: Ich MS SQL 2012 bin mit (oder neuer)

+0

Es sollte wahrscheinlich eine DataTable sein? – Sam

Antwort

0

Sie eine andere Methode ExecuteStoreQuery verwenden sollten, die Tabellenwertparameter (SqlDbType.Structured) ermöglicht die Angabe.

using (var table = new DataTable()) 
    { 
     table.Columns.Add("cs", typeof(string)); 
     foreach (var item in ITEMS) 
      table.Rows.Add(item.CD.ToString()); 

     var param1 = new SqlParameter("@x", SqlDbType.NVarChar) 
     { 
      Value = myValue 
     }; 
     var param2 = new SqlParameter("@c", SqlDbType.Structured) 
     { 
      Value = table 
     }; 

     ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<TestTbl_Result>(
      "select * from [TestTbl](@x, @c)", param1, param2); 

    } 
Verwandte Themen