如何使用实体框架从包含多个查询的存储过程创建复杂对象

本文关键字:存储过程 创建 复杂 对象 查询 实体 何使用 框架 包含多 | 更新日期: 2023-09-27 18:31:25

我不太了解EF,所以我真的很卡住。

我的目的是从存储过程在我的存储库层中创建一个复杂类型对象,通常该过程非常简单:

  • 从数据库更新模型

  • 双击选定的存储过程

  • 按"添加导入函数"表单中的"获取列信息"按钮

  • 然后,按"创建新的复杂类型"按钮

此时,EF 已在存储库层中创建了我的对象类型。

我的问题如下:

在我的 TSQL 代码中,我有很多查询,选择、插入等,但我的结果应该是最后一个执行的 SELECT,而不是 EF 得到第一个执行的。

如何获得正确的查询?

编辑:

这里是 SP:

    GO
    /****** Object:  StoredProcedure [dbo].[sp_CreaTestataOrdine]    Script Date: 09/15/2013 12:08:30 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:      <Author,,Name>
    -- Create date: <Create Date,,>
    -- Description: <Description,,>
    -- =============================================
    ALTER PROCEDURE [dbo].[sp_CreaTestataOrdine] (
    @LOGIN varchar(20), 
   [...] -- A LOT OF PARAMS
    )
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
        DECLARE @TMAMN varchar(6), 
        [...] -- A LOT OF DECLARATIONS
    DECLARE @tab TABLE (id_doc bigint, num_ordine varchar(7))

    SELECT @TMAMN = 'TMAMN', @TMAV2 = 'TMAV2', @TMAVR = 'TMAVR', @TMAVR = 'TMAVR', @TMAIN = 'TMAIN', @TMNMA = 'TMNMA', @TMNV2 = 'TMNV2', @TMNVR = 'TMNVR', @TV2MA = 'TV2MA', @TV2MN = 'TV2MN', @TV2VR = 'TV2VR', @TVRMA = 'TVRMA', @TVRMN = 'TVRMN', @TVRV2 = 'TVRV2', @TMAM2 = 'TMAM2', @TMNM2 = 'TMNM2', @TVRM2 = 'TVRM2', @TV2M2 = 'TV2M2', @TM2MA = 'TM2MA', @TM2MN = 'TM2MN' , @TM2VR = 'TM2VR' , @TM2V2 = 'TM2V2', @OVW1 = 'OVW1', @OVW2 = 'OVW2', @OVW3 = 'OVW3', @MAG_MARMIROLO = '2', @MAG_MANTOVA = '3', @MAG_INTERNET = '6', @MAG_VERONA = '4', @MAG_VERONA2 = '5', @MAG_MANTOVA2 = '8' 
SELECT * FROM utenti WHERE login = @LOGIN
IF @@ROWCOUNT > 0 
BEGIN
    SELECT @nome_ord = nome, @cognome_ord = cognome, @cod_fiscale_ord = codice_fiscale, @p_iva_ord = p_iva, @indirizzo_ord = indirizzo, @cap_ord = cap, @localita_ord = localita, @stato_ord = stato, @prov_ord = provincia, @tel_fisso = tel_fisso, @tel_cell = tel_cell, @email_ord = email, @cod_cliente = cod_cliente FROM utenti WHERE login = @LOGIN

END

IF @DEST_DIVERSA = 1
BEGIN
    SELECT @nome_ord = @nome_dest, @cognome_ord = @cognome_dest, @indirizzo_ord = @indirizzo_dest, @cap_ord = @cap_dest, @localita_ord = @localita_dest, @prov_ord = @provincia_dest, @tel_fisso = @telefono_dest, @email_ord = @email_dest
    SELECT * FROM spedizioni WHERE id_spedizione = @paese_dest_id
    IF @@ROWCOUNT > 0
    BEGIN   
        SELECT @stato_ord = nazione, @cod_iva_id = fk_cod_iva_id FROM spedizioni WHERE id_spedizione = @paese_dest_id
    END
END         
IF @cod_iva_id = ''
BEGIN
    SELECT @cod_iva_id = NULL
END
SELECT * FROM lk_codici_iva WHERE cod_iva_id = @cod_iva_id
IF @@ROWCOUNT > 0
BEGIN   
    SELECT @cod_iva_perc = cod_iva_perc, @cod_iva_descr = cod_iva_descr FROM lk_codici_iva WHERE cod_iva_id = @cod_iva_id
END
--la richiesta fattura è possibile solo se il cliente e la destinazione sono Italia
IF @richiesta_fattura = 1 AND @cod_iva_descr = '20'
BEGIN
    SELECT * FROM spedizioni WHERE id_spedizione = @paese_fatt_id
    IF @@ROWCOUNT > 0
    BEGIN
        SELECT @paese_fatt = nazione FROM spedizioni WHERE id_spedizione = @paese_fatt_id
    END
END 
IF @cod_iva_descr = 'A41'
BEGIN
    SELECT @causale_documento = @OVW2
END
ELSE IF @cod_iva_descr = 'A8'
BEGIN
    SELECT @causale_documento = @OVW3
END
ELSE IF @cod_iva_descr = '20'
BEGIN
    SELECT @causale_documento = @OVW1
END
SELECT @importo_iva = 0, @importo_imponibile = 0, @importo_contrassegno = NULL
IF @pagamento = 'Contrassegno'
BEGIN
    SELECT @importo_contrassegno = 5.0
    --calcolo l'imponibile sulle spese di contrassegno
    SELECT @importo_imponibile = @importo_imponibile + ((@importo_contrassegno * 100) / (100 + @cod_iva_perc))  
    SELECT @importo_totale = @importo_totale + @importo_contrassegno
END 
--calcolo l'imponibile sulle spese di spedizione
SELECT @importo_imponibile = @importo_imponibile + ((@spese_spedizione * 100) / (100 * @cod_iva_perc))  
IF @Standard = 1
BEGIN
    SELECT @mod_spedizione = 'Standard'
END
ELSE IF @Express = 1
BEGIN 
    SELECT @mod_spedizione = 'Express'
END
ELSE IF @Expedited = 1 
BEGIN
    SELECT @mod_spedizione = 'Expedited'
END
--imposto il numeratore per l'ordine di vendita generico
SELECT * FROM causali_documenti INNER JOIN numeratori ON fk_caus_doc_num = caus_doc_num WHERE caus_doc = @causale_documento
IF @@ROWCOUNT > 0
BEGIN
    SELECT @caus_doc_caus_mov1 = caus_doc_caus_mov1, @caus_doc_num = caus_doc_num, @descr_causale = caus_doc_descr, @num_progr = (num_progr + 1)  FROM causali_documenti INNER JOIN numeratori ON fk_caus_doc_num = caus_doc_num WHERE caus_doc = @causale_documento
END 
SELECT @num_ordine = dbo.StringAddZero(@num_progr, 7)   

--nel caso di bonifico e contrassegno l'ordine è da considerarsi definitivo quindi si applicano i movimenti di magazzino
IF @pagamento = 'Bonifico' OR @pagamento = 'Contrassegno'
BEGIN
    EXEC @cod_doc_def = sp_ProgressivoDoc
    BEGIN TRAN
    INSERT INTO documenti_testata(id_doc, [login], fk_caus_doc, descr_causale, cod_cliente, ragsoc_cliente, data_creazione, data_modifica, anno, num_ord_v, mod_pagamento, mod_spedizione, mod_contrassegno, utente, importo_spedizione, importo_contrassegno, importo_totale, fk_cod_iva_id, dest_diversa, cognome_dest, nome_dest, email_dest, indirizzo_dest, provincia_dest, cap_dest, localita_dest, telefono_dest, stato_dest, stato_usa_dest, richiesta_fattura, indirizzo_fatt, provincia_fatt, cap_fatt, localita_fatt, stato_fatt, stato_usa_fatt, p_iva_fatt, cod_fiscale_fatt) VALUES (@cod_doc_def, @LOGIN, @causale_documento, @descr_causale, @cod_cliente, @rag_soc, getdate(), getdate(), year(getdate()), @num_ordine, @pagamento, @mod_spedizione, @pag_contrassegno, @LOGIN, @spese_spedizione, @importo_contrassegno, @importo_totale, @cod_iva_id, @DEST_DIVERSA, @cognome_ord, @nome_ord, @email_ord, @indirizzo_ord, @prov_ord, @cap_ord, @localita_ord, @tel_fisso, @stato_ord, @stato_usa, @richiesta_fattura, @indirizzo_fatt, @provincia_fatt, @cap_fatt, @localita_fatt, @paese_fatt, @stato_usa_fatt, @p_iva, @cod_fiscale_fatt)
    UPDATE numeratori SET num_progr = num_progr + 1 WHERE caus_doc_num = @caus_doc_num
    IF (@@ERROR <> 0)
    BEGIN
        ROLLBACK TRAN
        --RETURN 1
    END 
    COMMIT TRAN
    INSERT @tab VALUES(@cod_doc_def, @num_ordine)
    SELECT * FROM @tab
END
-- nel caso di Paypal o della carta di credito occorre aspettare la conferma della transazione per rendere definitivo l'ordine pertanto carico l'ordine nella tabella temporanea
ELSE IF @pagamento = 'Paypal' OR @pagamento = 'Carta' OR @pagamento = 'Carta2'  
BEGIN
    BEGIN TRAN
    SET NOCOUNT ON; 
    INSERT INTO tmp_documenti_testata([login], fk_caus_doc, descr_causale, cod_cliente, ragsoc_cliente, data_creazione, data_modifica, anno, num_ord_v, mod_pagamento, mod_spedizione, mod_contrassegno, utente, importo_spedizione, importo_contrassegno, importo_totale, fk_cod_iva_id, dest_diversa, cognome_dest, nome_dest, email_dest, indirizzo_dest, provincia_dest, cap_dest, localita_dest, telefono_dest, stato_dest, stato_usa_dest, richiesta_fattura, indirizzo_fatt, provincia_fatt, cap_fatt, localita_fatt, stato_fatt, stato_usa_fatt, p_iva_fatt, cod_fiscale_fatt) VALUES (@LOGIN, @causale_documento, @descr_causale, @cod_cliente, @rag_soc, getdate(), getdate(), year(getdate()), @num_ordine, @pagamento, @mod_spedizione, @pag_contrassegno, @LOGIN, @spese_spedizione, @importo_contrassegno, @importo_totale, @cod_iva_id, @DEST_DIVERSA, @cognome_ord, @nome_ord, @email_ord, @indirizzo_ord, @prov_ord, @cap_ord, @localita_ord, @tel_fisso, @stato_ord, @stato_usa, @richiesta_fattura, @indirizzo_fatt, @provincia_fatt, @cap_fatt, @localita_fatt, @paese_fatt, @stato_usa_fatt, @p_iva, @cod_fiscale_fatt); 
    SELECT @cod_doc_tmp = SCOPE_IDENTITY();
    UPDATE numeratori SET num_progr = num_progr + 1 WHERE caus_doc_num = @caus_doc_num
    IF (@@ERROR <> 0)
    BEGIN
        ROLLBACK TRAN
        --RETURN 1
    END 
    COMMIT TRAN
    INSERT @tab VALUES(@cod_doc_tmp, @num_ordine)
     SELECT * FROM @tab **-- I WANT THIS ONE!!!!!**
END

END

PS:这个SP不是我的是遗产

如何使用实体框架从包含多个查询的存储过程创建复杂对象

最好的方法是替换@@ROWCOUNT

SELECT * FROM utenti WHERE login = @LOGIN
IF @@ROWCOUNT > 0 

改用局部变量@ROWCOUNT

-- ... at the start of your SP...
DECLARE @ROWCOUNT AS INT
-- ... in all your SELECT...
SELECT @ROWCOUNT = COUNT(*) FROM utenti WHERE login = @LOGIN
IF @ROWCOUNT > 0 

使用像@ROWCOUNT这样的变量名可以帮助您进行重构并保持相同的结构。