заполнить сложный тип в рамках сущности - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть комплексный тип SalesOrderHeader со следующими свойствами: OrderNumber CustomerName CustomerNumber PODate Комментарии Номер счета

Я создал хранимую процедуру (импорт функции) для заполнения этих свойств.В моей процедуре произнесите uspGetDetails, которые я использую:

Первый оператор select для получения первых 4 свойств OrderNumber, CustomerName, CustomerNumber, PODate.

Второй выбор Proprty для получения комментариев

3rd SelectСвойство для извлечения InvoiceNumber, как показано ниже

CREATE PROCEDURE uspGetHeaderDetails
-- Add the parameters for the stored procedure here
@OrderNumber CHAR(21)
AS
BEGIN
DECLARE @Counter INT;
DECLARE @OrignalNumber INT;

SELECT @Counter = count(*) FROM sop10100 WHERE sopnumbe = @OrderNumber

IF @Counter > 0 
BEGIN
    SELECT TOP 1 sopnumbe [OrderNumber]
        , custname  [CustomerName]
        , custnmbr  [CustomerNumber]
        , cstponbr  [CustomerPhoneNumber]
        , docdate   [PODate]
        , orignumb  [OriginalNumber]
    FROM sop10100
    WHERE sopnumbe = @OrderNumber
END
ELSE
BEGIN
    SELECT TOP 1 sopnumbe [OrderNumber]
        , custname  [CustomerName]
        , custnmbr  [CustomerNumber]
        , cstponbr  [CustomerPhoneNumber]
        , docdate   [PODate]
        , orignumb  [OriginalNumber]
    FROM SOP30200
    WHERE sopnumbe = @OrderNumber
END

     SELECT cmmttext [Comments]

     FROM sop10106 WHERE sopnumbe = @OrderNumber

SELECT sopnumbe [InvoiceNumber]

     FROM sop30200 WHERE orignumb = @OrderNumber
END

И ниже мой метод выполнения этой процедуры для заполнения SalesOrderHeader

[AcceptVerbs("POST")]
public ActionResult SearchResult(FormCollection collection )
{
    string orderNumber = collection["searchItem"].ToString();
    Models.SalesEntities db = new Models.SalesEntities();
    ObjectParameter[] parameters = new ObjectParameter[1];
    parameters[0] = new ObjectParameter("OrderNumber", orderNumber);
    var headerResult = db.ExecuteFunction<Models.SalesOrderHeader>("uspGetHeaderDetails", parameters);

    Models.SalesOrderHeader salesOrderHeader = new Models.SalesOrderHeader();
    salesOrderHeader = headerResult.SingleOrDefault();

    return View(salesOrderHeader);
}

ПРОБЛЕМА: Когда я выполняю это, яполучить сообщение о несовместимости данных, так как функция импорта выбирает результаты только первого запроса.результаты 2-го и 3-го запросов, т. е. комментарии и InvoiceNumber не выбираются.

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

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Нет, это невозможно с текущей версией (4.0) EF. Текущая версия не поддерживает хранимые процедуры с несколькими наборами результатов (более одного выбора внутри процедуры). Эта функция была анонсирована в июне 2011 года CTP и должна быть частью EFv4.5 (часть .NET 4.5).

В настоящее время единственный способ использовать хранимые процедуры, возвращающие несколько наборов результатов, - это использовать EFExtensions , но код намного более сложный .

0 голосов
/ 06 апреля 2012

Имейте в виду, что номер вашего счета-фактуры будет фактически введен в SOP10100, прежде чем он будет опубликован. Сначала вам нужно будет проверить SOP10100 для номера счета в SOPNUMBE, а затем проверить SOP30200. Помните, что SOP10100 является активной таблицей заголовков SOP, а SOP30200 является исторической таблицей заголовков SOP.

IF EXISTS (SELECT 1 FROM SOP10100 WHERE ORIGNUMB = @OrderNumber)
    BEGIN
        SELECT SOPNUMBE [InvoiceNumber]
        FROM SOP10100 WHERE ORIGNUMB = @OrderNumber
    END
 ELSE
    BEGIN
        SELECT SOPNUMBE [InvoiceNumber]
        FROM SOP30200 WHERE ORIGNUMB = @OrderNumber
    END

Обратите внимание на оператор IF, который я использовал выше. Использование функции count(*) для определения того, находится ли искомая запись в активной или хронологической таблице, более требовательно к производительности. Эта же идея может быть использована в вашем первоначальном запросе:

IF EXISTS (SELECT 1 FROM SOP10100 WHERE SOPNUMBE = @OrderNumber)
    BEGIN
        SELECT TOP 1 SOPNUMBE [OrderNumber]
            , CUSTNAME [CustomerName]
            , CUSTNMBR [CustomerNumber]
            , CSTPONBR [CustomerPhoneNumber]
            , DOCDATE [PODate]
            , ORIGNUMB [OriginalNumber]
        FROM SOP10100
        WHERE SOPNUMBE = @OrderNumber
    END
    ELSE
    BEGIN
        SELECT TOP 1 SOPNUMBE [OrderNumber]
            , CUSTNAME [CustomerName]
            , CUSTNMBR [CustomerNumber]
            , CSTPONBR [CustomerPhoneNumber]
            , DOCDATE [PODate]
            , ORIGNUMB [OriginalNumber]
        FROM SOP30200
        WHERE SOPNUMBE = @OrderNumber
    END

Как уже упоминалось в ответе Ладислава, вам, вероятно, потребуется разбить эту хранимую процедуру на 3 различных хранимых процедуры, пока EF не будет обновлен в соответствии с требованиями вашего проекта.

...