我有一个现有的存储过程,我现在尝试使用LINQ to SQL调用,这是存储过程:
ALTER procedure [dbo].[sp_SELECT_Security_ALL] (
@UID Varchar(15)
)
as
DECLARE @A_ID int
If ISNULL(@UID,'') = ''
SELECT DISTINCT
App_ID,
App_Name,
App_Description,
DB,
DBNameApp_ID,
For_One_EVA_List_Ind
From v_Security_ALL
ELSE
BEGIN
Select @A_ID = (Select Assignee_ID From NEO.dbo.v_Assignees Where USER_ID = @UID and Inactive_Ind = 0)
SELECT DISTINCT
Security_User_ID,
Security_Company,
Security_MailCode,
Security_Last_Name,
Security_First_Name,
Security_User_Name,
Security_User_Info,
Security_User_CO_MC,
Security_Email_Addr,
Security_Phone,
Security_Security_Level,
Security_Security_Desc,
Security_Security_Comment,
Security_Security_Inactive_Ind,
App_ID,
App_Name,
App_Description,
DB,
DBNameApp_ID,
For_One_EVA_List_Ind,
@A_ID as Assignee_ID
From v_Security_ALL
Where Security_User_ID = @UID
END
我的问题是intellsense只能看到IF语句中的第一组返回值,而且我无法从存储过程的“else”部分访问任何内容。所以当我尝试这样做时:
var apps = dataContext.sp_SELECT_Security_ALL(userId);
foreach (var app in apps)
{
string i = app.
}
在应用程序上。部分我唯一可用的值是上面第一个Select distinct的结果。
是否可以将LINQ用于此类存储过程?
答案 0 :(得分:1)
问题不在于Intellisense。 dataContext.sp_SELECT_Security_ALL()
正在返回固定数据类型。您可能隐藏在“var”后面,但它仍然是具有固定数量属性的具体类型。还有C#记住,一个函数只能返回一种类型的对象。查看dataContext.designer.cs文件,了解它是如何实际定义的。
答案 1 :(得分:1)
Scott Guthrie已经涵盖了此案in a blog post。向下滚动到“处理来自SPROC的多个结果形状。”
答案 2 :(得分:1)
解决这个问题的快速而肮脏的方法是强制每个返回语句返回相同的内容:
IF @theSkyIsBlue
SELECT CustomerNumber, CustomerName, null as OrderNumber, null as OrderName
FROM Customers
ELSE
SELECT null as CustomerNumber, null as CustomerName, OrderNumber, OrderName
FROM Orders
您可能必须观察/(手动更改)映射类型中属性的可空性,但这样可以帮助您实现目标。