我试图创建一个能够接收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.
那么最好的方法是什么呢?