[英]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.