【发布时间】:2021-08-23 20:39:08
【问题描述】:
我有一个以这种格式返回数据的存储过程
IF @Count = 0
SELECT 0
ELSE IF @COUNT = 1
SELECT 1
ELSE
SELECT 'Col_1', 'Col_2', 'Col_3'
FROM [TABLE_NAME]
WHERE [CONDITION]
当尝试在实体框架中为此“函数导入”映射结果时,如果我将返回设置为由“Col_1”、“Col_2”、“Col_3”组成的复杂类型,则当@Count 更大时它工作得很好大于 1。对于 @Count 0 或 1,我收到有关缺少列的错误。
如果我将返回值设置为整数,它适用于 @count 0 和 1,但不适用于 @Count > 1
我尝试将复杂类型中的列设置为“可空”,还添加了一个设置为整数的空白列,但没有成功。
我在这里唯一的选择是修改 SP 以始终返回一组结果吗?还是用老式的 ADO.NET 方式调用存储过程?
【问题讨论】:
-
这是不这样做的最令人信服的原因之一 - 理想情况下,存储过程应该始终返回相同的数据“形状”,例如相同数量和类型的列
-
我很好奇。如果你运行
SELECT * FROM Person WHERE Name = '...',有时你有 10 个人记录,而其他时候你只有一个数字1,作为一个聪明人,你会感到困惑吗?现在想象一下 EF 必须有多么混乱,总是期望它可以变成一个 Person 实体.. -
我认为了解这里的逻辑有多糟糕的一个好方法是考虑你会如何命名这样的 sproc,以便以前没有使用过它的人可以很容易地理解它的目的。像
GetThingsByName这样的名称可以非常清楚地说明过程/函数的作用。你会怎么称呼这个sproc?没有一个简单的名称可以清楚地表明它的用途,所以它是一个糟糕的 sproc。 -
这个想法是如果没有找到执行条件的匹配项,则返回 0,完全匹配返回 1,如果存在超过 1 个匹配项,则返回整个结果集。我们的数据库认为这是最好的方法,但它与实现代码并不能很好地配合。我会尝试更新这个存储过程
标签: c# vb.net entity-framework stored-procedures