简体   繁体   English

如何通过存储过程和多个查询使用Entity Framework创建复杂对象

[英]How create a complex object with Entity Framework from a Stored Procedure whitin multiple queries

I don't know EF so well so I'm really stucked. 我对EF不太了解,所以我真的很困惑。

My purpose is create a complex type object in my repository layer from a stored procedure, usually the process is really easy: 我的目的是从存储过程在存储库层中创建一个复杂类型的对象,通常该过程非常简单:

  • Update Model from database 从数据库更新模型

  • double click on the selected stored procedure 双击所选的存储过程

  • press the button "Get Column Information" in Add Import Function form 在“添加导入功能”表单中按“获取列信息”按钮

  • Then, press the button "Create new complex type" 然后,按下按钮“创建新的复杂类型”

At this point EF has created my object type in my repository layer. 至此,EF在我的存储库层中创建了我的对象类型。

My problem is the following: 我的问题如下:

In my TSQL Code I have a lot of queries, SELECT, INSERT, Etc.. but my result it should be the last SELECT executed, instead EF gets the first one executed. 在我的TSQL代码中,我有很多查询,SELECT,INSERT等。但是我的结果应该是最后执行的SELECT,而EF得到了第一个执行的查询。

How can I get the right query? 如何获得正确的查询?

EDIT: 编辑:

Here the SP: 这里的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: This SP is not Mine is a legacy PS:此SP不是我的遗留物品

The best way is to replace @@ROWCOUNT : 最好的方法是替换@@ROWCOUNT

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

using instead a local variable @ROWCOUNT : 而是使用局部变量@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 

using a variable name like @ROWCOUNT can help you with the refactoring and to mantain the same structure. 使用类似@ROWCOUNT的变量名称可以帮助您进行重构并保持相同的结构。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 存储过程无法在实体框架中创建复杂类型 - Stored procedure cannot create complex type in entity framework 实体框架4-如何从存储过程中读取多个记录集? - Entity Framework 4 - How to Read Multiple Record Sets From A Stored Procedure? 在Entity Framework 5中使用复杂类型的存储过程吗? - Using stored procedure in Entity Framework 5 with complex type? 实体框架从存储过程获取选择命令对象 - Entity Framework get a select command object from a stored procedure 使用实体框架从存储过程中获取多个字符串输出 - get multiple string outputs from stored procedure using entity framework 如何在 Entity Framework Core 中的多个表上使用联接调用存储过程? - How to call Stored Procedure with join on multiple tables in Entity Framework Core? 如何从存储过程结果实体框架创建列表 - How do I create a list from stored procedure results Entity Framework 在Entity Framework数据库优先方法中,如何从存储过程返回多个结果集? - In Entity Framework database-first approach how to return multiple result sets from a stored procedure? 如何使用 FromSqlRaw Entity Framework Core 3.1 从存储过程返回多个 SELECT 集 - How to return multiple SELECT sets from a stored procedure using FromSqlRaw Entity Framework Core 3.1 在实体框架中创建异步存储过程调用 - Create async stored procedure call in Entity Framework
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM