2016-07-14 7 views
3

Ich habe die folgende gespeicherte Prozedur, die eine dynamische Abfrage aufruft, die mehrere Zeilen zurückgibt.Ergebnis der gespeicherten Prozedur in eine Liste des komplexen Typs zurückgeben

CREATE PROCEDURE [dbo].[usp_list_connections] @skip int, @take int = 50 
WITH EXECUTE AS OWNER 
AS 
BEGIN 
    IF 1 = 2 -- For EF to recognize columns 
    BEGIN 
     SELECT CAST(1 AS int) [Id], CAST('A' AS nvarchar(100)) [Name], CAST(1 AS bit) [Sim], CAST(1 AS bit) [Device] 
    END 
    DECLARE @q NVARCHAR(MAX) =''; 
     SET @q = N' 
     SELECT DISTINCT e.[Id], e.[Name], 
     CASE 
      WHEN s.[Sim] IS NULL THEN 0 
      ELSE 1 END AS [Sim], 
     CASE 
      WHEN d.[Device] IS NULL THEN 0 
      ELSE 1 END AS [Device] 
     FROM [dbo].[Employee] e 
      LEFT JOIN [dbo].[Sim] s ON s.[Employee] = e.[Id] 
      LEFT JOIN [dbo].[Device] d ON d.[Employee] = e.[Id] 
     ORDER BY e.[Name] 
     OFFSET @skip ROWS 
     FETCH NEXT @take ROWS ONLY;' 
    SET @q = REPLACE(@q, '@skip', @skip); 
    SET @q = REPLACE(@q, '@take', @take); 

    EXEC sp_executesql @q; 
END 

Ich importierte die Prozedur in EF und mappte es auf einen komplexen Typ. Wenn ich versuche, das Verfahren durch EF mit dem folgenden Code

var result = db.usp_list_connections(0,50); 

Es gibt eine Fehlermeldung ausgeführt werden, die die folgende ist:

„Das Ergebnis einer Abfrage kann nicht mehr als einmal aufgezählt werden.“

Was mache ich falsch? Wie kann ich die Ergebnismenge dieser gespeicherten Prozedur in einer Variablen speichern? Vielen Dank im Voraus.

Antwort

1

Versuchen Sie, Ihre Abfrage materialisieren durch ToList() Aufruf wahrscheinlich Ihr Problem lösen:

var result = db.usp_list_connections(0,50).ToList(); 
+0

Wenn ich das versuche ich die folgende Fehlermeldung erhalten: Eine Ausnahme des Typs ‚System.InvalidOperationException‘ in EntityFramework.dll aufgetreten wurde jedoch nicht im Benutzercode behandelt Weitere Informationen: Die Eigenschaft 'Sim' in 'usp_list_connections_Result' konnte nicht auf einen 'System.Int32'-Wert gesetzt werden. Sie müssen diese Eigenschaft auf einen Nicht-Null-Wert vom Typ 'System.Boolean' festlegen. – tatgergo

+0

@tatgergo Stellen Sie sicher, dass Ihr 'DatabaseContext' sich mit der richtigen Datenbank verbindet. Und Ihr Schema und die Entität stimmen überein. –

+0

Ich habe überprüft und sie stimmen überein. Und ich habe mich mit der richtigen DB verbunden. – tatgergo