2010-11-08 98 views
1

我正在从sproc检索linq的数据并得到一个异常“子查询返回的值超过1,当子查询跟在=时,这是不允许的! =,<,< =,>,> =或者当子查询用作表达式时。“。奇怪的是,它从SQL Server Management Studio运行正常。 该存储过程是这样的:LINQ到SQL返回“子查询返回多个值”,但它不应该

BEGIN 
DECLARE @LoginRights Table(RowNo int, TabID int, MenuID int, ControlID int) 
INSERT INTO @LoginRights SELECT row_number() Over (order by ControlID), TabID, MenuID, ControlID FROM dbo.func_Action_LoginRoles(@LoginID) --WHERE [email protected] AND ControlID is not null 
DECLARE @RightsCount [email protected]@RowCount, @iRow int =1,@ControlID int,@MenuID int; 

DECLARE @Menu Table(MenuID int) 
INSERT INTO @Menu(MenuID) 
SELECT MenuID FROM (
SELECT m.ID MenuID, t.ID TabID FROM dbo.tblAction_Menu m JOIN dbo.tblAction_MenuGroup mg on m.GroupID=mg.ID JOIN tblAction_Tabs t on t.ID=mg.TabID 
WHERE t.ID IN(SELECT TabID FROM @LoginRights WHERE MenuID is null) or 
m.ID IN(SELECT MenuID FROM @LoginRights WHERE MenuID is not null) 
) m Group by m.MenuID 
DECLARE @ControlsInMenu Table(MenuID int, ControlID int) 
WHILE @iRow<[email protected] BEGIN 
SELECT @ControlID=ControlID, @MenuID=MenuID FROM @LoginRights WHERE [email protected] 
IF @MenuID is null BEGIN 
    INSERT INTO @ControlsInMenu(MenuID, ControlID) 
    SELECT MenuID, @ControlID FROM @Menu 
END ELSE BEGIN 
    INSERT INTO @ControlsInMenu(MenuID, ControlID) 
    SELECT @MenuID, @ControlID 
END 
SET @[email protected]+1 END 
SELECT MenuID, ControlID FROM @ControlsInMenu 
END 
 
The function: 
ALTER FUNCTION [dbo].[func_Action_LoginRoles] 
(@LoginID int) 
RETURNS @LoginsRoles TABLE(ID int, Name nvarchar(50), TabID int, MenuID int, ControlID int) 
AS 
BEGIN 
INSERT INTO @LoginsRoles (ID, Name, TabID, MenuID, ControlID) 
SELECT lr.ID, lr.Name, TabID, MenuID, ControlID FROM tblLogins_Roles lr 
    JOIN tblLogins_RolesInGroup rig ON lr.ID=rig.RolesID 
    JOIN tblLogins_Roles_Groups lrg ON lrg.ID=rig.Roles_GroupID 
    JOIN tblLogins l ON l.Roles_GroupID=lrg.ID WHERE [email protected] 
RETURN 
END 

数据检索方法是这样的(C#/ LINQ到SQL):

var ControlsInMenu = from c in dc.proc_Action_ControlsInMenu(LoginData.LoginID, TabID) 
        select new 
        { 
         c.MenuID, 
         c.ControlID 
        }; 
+0

定义“运行OK SQL服务器管理工​​作室”。它在SSMS中精确返回1行? – 2010-11-08 07:08:12

+1

我甚至不能*看到下面的子查询=,!=等 - 你确定问题不在'func_Action_LoginRoles'中吗? – 2010-11-08 07:26:13

+0

请您发布'func_Action_LoginRoles' - 否则我会得出结论,没有足够的信息来回答这个问题... – 2010-11-08 07:34:23

回答

1

阿。你的查询返回多个结果集(循环中每次一个),而LINQ to SQL大概无法处理这个结果集。

如果你想的LINQ to SQL处理此,我建议你换以下两行:

SELECT MenuID, ControlID FROM @ControlsInMenu 
END 
+0

谢谢。但我认为情况并非如此。如果我删除所有的代码并且只留下一条select语句,那么linq会崩溃(sproc不会)。我可能直接从表中获取数据(var MenuGroup = from dc.tblAction_MenuGroups中的m),尽管为什么linq会让人感到有趣。 – Saulius 2010-11-08 14:59:05

0

检查,看看如果从dbo.func_Action_LoginRoles(@LoginID)

得到任何重复
0

我已经找到了。错误“子查询返回的值超过1”..不是在db.designer中显示的过程中发生的。它实际上发生在以前的数据消耗方法中。着名的KISS原则在行动:-)