
Originariamente inviata da
pietro09
Il discorso fila, ma è alla fine solo l'utilizzo pratico che può permettere di scegliere una tecnica piuttosto che un'altra.
Per esempio, io preferisco trattare l'xml e una serie di tabelle oracle, con strumenti diversi: xpath per l'uno e il classico sql per il secondo.
Andiamo sul pratico: ho una tabella o vista oracle e voglio fare una ricerca o voglio impostare un filtro.
Tipicamente presento un popup con diversi campi. Il risultato è la composizione della condizione where di una istruzione sql.
Bene, si riesce a farlo questo con Linq? se si, un esempio?
Credo di capire dove vuoi arrivare, quindi cerco di andare al punto che immagino ti interessi 
Per prima cosa se lavori con Oracle dovresti scaricare il data provider per net da loro sito, ma non mi è mai capitato di usare Oracle con EF, quindi segui un po il loro sito, anche se dovrebbe essere come tutti gli altri provider. Dopo avendo già una stringa con SQL che ti arriva dal client web (si?), non devi far altro che darla in pasto al DbSet tramite SqlQuery.
Il contesto:
codice:
public class Context : DbContext
{
public Context() : base("DB") { }
public DbSet<Stato> Stati { get; set; }
public DbSet<Continente> Continenti { get; set; }
}
[Table("Stati")]
public class Stato
{
public int ID { get; set; }
public string Nome { get; set; }
public int Continente_ID { get; set; }
[ForeignKey("Continente_ID")]
public Continente Continente { get; set; }
}
[Table("Continenti")]
public class Continente
{
public int ID { get; set; }
public string Nome { get; set; }
public List<Stato> Stati { get; set; }
public Continente()
{
this.Stati = new List<Stato>();
}
}
aggiungiamo qualche dato e salviamo (per esempio con linq)
codice:
using (Context ctx = new Context())
{
var Europa = new Continente() { Nome = "Europa" };
Europa.Stati.Add(new Stato() { Nome = "Italia" });
Europa.Stati.Add(new Stato() { Nome = "Francia" });
Europa.Stati.Add(new Stato() { Nome = "Albania" });
Europa.Stati.Add(new Stato() { Nome = "Belgio" });
var America = new Continente() { Nome = "America" };
America.Stati.Add(new Stato() { Nome = "Brasile" });
America.Stati.Add(new Stato() { Nome = "Argentina" });
America.Stati.Add(new Stato() { Nome = "Cile" });
America.Stati.Add(new Stato() { Nome = "USA" });
ctx.Continenti.AddRange(new[] { Europa, America });
ctx.SaveChanges();
}
l'uso con query sql:
codice:
using (Context ctx = new Context())
{
var statiAmericani = ctx.Stati.SqlQuery("SELECT * from dbo.Stati WHERE Continente_ID=1").ToList();
}
l'uso con stored:
codice:
using (Context ctx = new Context())
{
var statiAmericani = ctx.Stati.SqlQuery("dbo.GetStatiByContinente_ID @p0",1).ToList();
}
comandi al database:
codice:
using (Context ctx = new Context())
{
ctx.Database.ExecuteSqlCommand("UPDATE dbo.Stati SET Nome ..."); }
nel config devi aggiungere il nome che vuoi dare alla stringa di connessione, io nel costruttore vuoto del Context passo alla base "DB", quindi dovrebbe avere questo nome, ma puoi usare quello che ti pare.
codice:
<connectionStrings>
<add name="DB" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS;Database=Linq;Integrated Security=True;"/>
</connectionStrings>
Nel tuo caso dovrai mettere come providerName la stringa del provider Oracle (lo vedrai eventualmente nel loro sito).
Comunque ci sono anche altri modi anche con sintassi linq (crei dei predicati che accodi), ma se devo essere onesto per il web preferisco altre soluzioni, tipo Breeze, che mi consente di scrivere query in javascript del tutto simili a linq (o in c# qualora voglia connettermi tramite App) direttamente sul client, e interrogare il server direttamente con quelle tramite chiamate in background alle WebApi alimentate da EF. Sul server lascio solo il minimo indispensabile magari legato a ruoli o permessi, e ovviamente i vari controlli lato server.
Ammollarinci goppai!