giovedì 18 agosto 2011

multi binding fra tabelle con linq

Ciao,

oggi vi riporto un problema ormai frequente quando si comincia ad usare in applicazioni asp linq associato con gridview.

Immaginate di fare una select facendo varie join tra tabelle e poi passarla ad una gridview, sapete qual'è il risultato?

DataBinding:
'<>f__AnonymousType0`2.......... ovvero il campo non viene riconosciuto nella
sorgente dati passata alla gridview


La soluzione è associare il nome della tabella seguita dal nome campo alla proprietà DataField;

DataField="nomeTabella.nomeCampo"


però questo non basta poichè, o sia un problema o un peculiarità, il tutto funziona se si converte il campo in TemplateField.


Per capirci meglio vi riporto un esempio;

Immaginiamo di fare una semplice select fra due tabelle (ovviamente usando linq) e associarli alla gridview:

var query = from C in clienti
join OV in orariVisita on C.id equals OV.idCliente into JoinedCliOrarVis
from OV in JoinedCliOrarVis.DefaultIfEmpty()
select new { C, OV};

MiaDataGridView.DataSource = query;
MiaDataGridView.DataBind();

<asp:GridView ID="GridView4" runat="server" autogeneratecolumns="False"
width="10%">
<asp:BoundField DataField="C.nominativo" HeaderText="Nominativo" />
<asp:BoundField DataField="OV.oraVisita" HeaderText="Orario Visita" />
</asp:GridView>

In questo caso si ottiene l'errore ugualmente, ma se si converte il campo in TemplateField, il campo viene riconosciuto.

<asp:GridView ID="GridView4" runat="server" autogeneratecolumns="False"
width="10%">
<columns>
<asp:templatefield headertext="Nominativo">
<itemtemplate>
<asp:Label ID="NominativoLabel" runat="server"
text='<%# Eval("C.nominativo") %>'></asp:Label>
</itemtemplate>
</asp:templatefield>
<asp:templatefield headertext="Orario Visita">
<itemtemplate>
<asp:Label ID="OraVisitaLabel" runat="server"
text='<%# Eval("OV.oraVisita") %>'></asp:Label>
</itemtemplate>
</asp:templatefield>
</columns>
</asp:GridView>

martedì 16 agosto 2011

left / right join con linq

Dopo un periodo si assenza eccomi qui.
Spesso vedo tra vari post difficoltà da parte di programmatori nel realizzare una left o right join con linq.
Ecco la soluzione:

Left join
var query = from C in clienti
join OV in orariVisita on C.id equals OV.idCliente into JoinedCliOrarVis
from OV in JoinedCliOrarVis.DefaultIfEmpty()
select new {nominativo = C.nominativo, oraVisita = OV.oraVisita};

ovviamente se si vuole una right join basta invertire la query:

Right join

var query = from OV in orariVisita
join C in clienti on  OV.idCliente equals  C.id into JoinedOrarVisCli
from OV in JoinedOrarVisCli.DefaultIfEmpty()
select new {nominativo = C.nominativo, oraVisita = OV.oraVisita};


penso che sia molto semplice.

Buon lavoro :-)