创建和使用存储过程来检查TVP值

时间:2015-05-08 15:55:00

标签: c# entity-framework sql-server-2012

我试图创建一个能够接收TVP的功能,并检查另一个表是否具有TVP中每个值的匹配条目,并返回一个简单的位来指示它们是否全部匹配。所以我有这样的事情:

CREATE PROCEDURE [dbo].[fCheckAccess]
@userId int,
@items dbo.TypeCodeInteger READONLY
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @count int
    DECLARE @rCount int
    DECLARE @bit BIT

    SET @count = (SELECT count(vr.code)
    from @items r left join dbo.vAccess vr
    on r.Code = vr.code and r.Type = vr.type 
    where vr.uid = @userId)

    SET @rCount = (SELECT count(*) from @items)

    set @bit = IIF(@count = @rCount, 1, 0)

    return @bit
END

因此,我们的想法是将TVP加入vAccess表,并计算匹配行的数量。然后将其与TVP中的行数进行比较,并返回1或0.我认为可能有更简洁的方法来执行此操作。

现在我的问题是尝试使用实体框架实际访问它。我试过这样的事情:

using (var ctx = new MyEntities())
{
    var r = new DataTable();
    r.Columns.Add("Type",typeof(byte));
    r.Columns.Add("Code", typeof(int));
    r.Rows.Add(2, 5);
    r.Rows.Add(1, 760);
    r.Rows.Add(4, 39);
    r.Rows.Add(2, 1746);
    r.Rows.Add(2, 1);
    r.Rows.Add(2, 2);

    var b = ctx.Database.SqlQuery<int>("EXEC dbo.fCheckAccess @userId, @items",
        new SqlParameter("@userId", SqlDbType.Int) { Value = 1893 },
        new SqlParameter("@regions", r) { TypeName = "TypeCodeInteger" });

    Console.WriteLine(b.First());
}

但这不起作用。在Console.WriteLine行,我收到EntityCommandExecutionException消息:

The data reader has more than one field. Multiple fields are not valid for 
EDM primitive or enumeration types.

那么最好的方法是什么呢?

0 个答案:

没有答案