35 messaggi dal 31 marzo 2010
Ciao a tutti, sto cercando di scrivere una query Linq To Sql che faccia due left outer join consecutive.
Con una sola sono riuscito ma tentando di replicare lo stesso meccanismo con la seconda ottengo un errore di scope...non riesco proprio a capire come poterne uscire.
Vi allego il codice SQL della query che vorrei realizzare ed il codice LinqToSql che sto provando a scrivere...dove sbaglio??
select * 
  from Dettaglio_Ordini 
  inner join Formati on Dettaglio_Ordini.ID_Formato = Formati.ID_Formato
  left outer join PromoCoupons on Dettaglio_Ordini.Coupon = PromoCoupons.Code
  left outer join Promo on PromoCoupons.ID_Promo = Promo.ID_Promo


Ed il codice LinqToSql
var q = from o in Dettaglio_Ordini 
    join f in Formati on o.ID_Formato equals f.ID_Formato
    join p in PromoCoupons on o.Coupon equals p.Code into TEMP
    from c in TEMP.DefaultIfEmpty() -- RIGA 1
    join s in Promo on s.ID_Promo equals c.ID_PROMO into TEMP2
    from d in TEMP2.defaultIfEmpty()
    select new {o, f, c, d};

q.Dump();


Fino alla RIGA1 la query funziona correttamente ma mi manca la successiva left outer join... dove sbaglio?

Grazie a tutti.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
cerca di evitare le join esplicite, infatti non bisogna tradurre alla lettera ciò che faresti col linguaggio SQL.

Usa invece le proprietà di navigazione: le tue query saranno molto più concise e leggibili ed è probabile che il comando SQL risultante sia più efficiente.

Leggi questo articolo.
Don't use Linq Joins, Navigate!

Inoltre, su MSDN trovi la documentazione che spiega come mappare le associazioni tra le entità (es. tra Promo e PromoCoupons) e come creare le proprietà di navigazione che userai nella query LINQ.
http://msdn.microsoft.com/en-us/library/bb386950.aspx

ciao,
Moreno
Modificato da BrightSoul il 01 ottobre 2013 20.18 -

Enjoy learning and just keep making
35 messaggi dal 31 marzo 2010
Grazie mille per il link; purtroppo ho ereditato questa base dati già ampiamente popolata, ho generato il modello partendo quindi da un db esistente..adesso mi leggo bene i link che mi hai mandato: vediamo se mi chiarisco un pò le idee!
35 messaggi dal 31 marzo 2010
Ho provato a generarmi le navigation property tra Promo e PromoCoupons però mi da un errore in compilazione del tipo:

Error  8  Error 3004: Problem in mapping fragments starting at line 1174:No mapping specified for properties PromoCoupons.PromoID_Promo in Set PromoCoupons.
An Entity with Key (PK) will not round-trip when:
  Entity is type [DB_CALCIOVERONAZOOM.PromoCoupons]
  C:\Users\nicolo.sonato\Dropbox\PROGETTI\CalcioVeronaZoom2\CalcioVeronaZoom2\Models\CVZ.edmx  1175  15  CalcioVeronaZoom2



Credo che il motivo sia perchè fisicamente sul db non esista i campo PromoID_Promo nella tabella PromoCoupons.
Lo devo creare e poi aggiornare il model?
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
no, non creare quel campo perché la tabella PromoCoupons ha già una chiave esterna in ID_Promo. E' questo il campo che deve essere coinvolto nell'associazione.

Comunque, riavvolgiamo un attimo la questione.
Nel tuo progetto immagino che esista un file .dbml, che è quello che ti permette di generare le classi Linq to Sql.
Quando fai doppioclick sul file dbml, Visual Studio ti aprirà l'editor visuale delle classi. Quando si trascina una tabella del db (es. PromoCoupons) dentro l'editor, Visual Studio creerà automaticamente le associazioni con le altre tabelle già presenti (es. Promo). Se questo non succede, è perché chi ha progettato il database non ha creato i vincoli tra le tabelle e quindi Visual Studio non può sapere come siano relazionate tra loro.

Mentre sei nell'editor delle classi, tu puoi comunque creare un'associazione facendo tasto destro sulla classe PromoCoupons e cliccando Add -> Association. Ti apparirà una finestra da cui dovrai selezionare il nome dell'altra tabella (Promo) e dei campi coinvolti.
Questo creerà le proprietà di navigazione che ti servono.

sonnicolo ha scritto:

ho ereditato questa base dati già ampiamente popolata

ok, allora modifica con attenzione. Se il progetto è sottoposto a controllo di versione, magari crea un branch.

ciao,
Moreno.

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.