0

引数としてテーブル値のパラメータを必要とするDB関数があります(@c)。EF 6.xとテーブル値のパラメータを持つ関数

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 

機能がDbContextにこのようEFデザイナー(データベースファースト)から構築されています:私はのみ利用可能X/@ Xパラメータを渡し、この関数を呼び出す

[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); 
    } 

場合、私はこの例外を取得:

ex {"An error occurred while executing the command definition. See the inner exception for details."} System.Exception {System.Data.Entity.Core.EntityCommandExecutionException} 
ex.InnerException {"An insufficient number of arguments were supplied for the procedure or function TestTbl."} System.Exception {System.Data.SqlClient.SqlException} 

@cパラメータを関数に渡す方法がわかりません。誰でも助けることができますか?

ありがとうございます。

p.s:私はあなたがテーブル値パラメータ(SqlDbType.Structured)を指定することができます別の方法のExecuteStoreQueryを使用する必要があります

+0

おそらくDataTableでしょうか? – Sam

答えて

0

をMS SQL 2012(以降)を使用しています。

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); 

    } 
関連する問題