Linq to SQL, хранимая процедура с различными типами возврата на основе If / Else - PullRequest
2 голосов
/ 12 ноября 2008

У меня есть существующая хранимая процедура, которую я сейчас пытаюсь вызвать с помощью 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.
        }

В приложении. часть единственные доступные значения, которые у меня есть, это результаты первого выбора, отличного выше.

Можно ли использовать LINQ с этим типом хранимой процедуры?

Ответы [ 3 ]

1 голос
/ 12 ноября 2008

Скотт Гатри рассмотрел этот случай в блоге . Прокрутите вниз до пункта «Обработка нескольких форм результатов из SPROC».

1 голос
/ 21 ноября 2008

Быстрый и грязный способ исправить это - принудить каждое возвращаемое выражение возвращать одно и то же:

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

Возможно, вам придется наблюдать / (вручную изменять) обнуляемость свойств в сопоставленном типе, но это поможет вам двигаться туда.

1 голос
/ 12 ноября 2008

Проблема не в Intellisense. dataContext.sp_SELECT_Security_ALL() возвращает фиксированный тип данных. Вы можете скрывать это за «var», но тем не менее это конкретный тип с фиксированным количеством свойств. C # еще помните, и функция может возвращать только один тип объекта. Посмотрите в свой файл dataContext.designer.cs, чтобы увидеть, как он на самом деле определен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...