2010-07-28 6 views
6

Sto confrontando i set di dati EF e digitati per la loro utilità. Non riuscivo a capire perché dovresti utilizzare l'EF su set di dati digitati se l'EF è associato solo a SQL Server. Ma è vero che le dichiarazioni LINQ EF vengono valutate in ritardo nel rispetto che se hai fatto qualcosa di simile:Qualcuno può chiarire la differenza chiave tra Entity Framework e Dated Set tipizzati?

db.Customers.where(c => c.Name == "John Smith") 

L'EF sarebbe costruire una query come:

select * from Customers where Name = 'John smith' 

ma con dataset tipizzati si potrebbe scrivere:

bll.GetCustomers().where(c => c.Name == "John Smith") 

che è molto simile, ma la differenza è vero primi giri:

select * from Customers 

E quindi utilizzando la raccolta di raccolte standard trova le righe che contengono il nome: "John Smith". In teoria, l'EF sarà più efficiente.

È corretto?

+0

Buona domanda semplice che illustra un punto che potrebbe non essere immediatamente evidente. –

+0

EF - Dataset buoni, tipizzati - Blaaaaah. – zmbq

risposta

4

Sì. Con Entity Framework, utilizza IQueryable<T> per costruire le tue query. Facendo:

var results = db.Customers.Where(c => c.Name == "John Smith"); 

Internamente, i risultati saranno IQueryable<Customer> (o il tipo). Ciò consente al provider (EF) di ottimizzare il modo in cui viene eseguito internamente. Nel caso di SQL Server, la query effettiva inviata al server avrà già la clausola WHERE SQL in posizione, che a sua volta significherà che verrà restituito un solo record (se "Name" è univoco) dal DB invece di ogni record.

Utilizzando set di dati digitati, si restituiscono tutti i record, quindi si ricercano i risultati per il nome appropriato in seguito. Questo è potenzialmente molto meno efficiente.

+0

Grande, questo era solo il tipo di risposta che stavo cercando :) Ora per capire se utilizzo l'EF come livello di accesso ai dati o se lo astraggo con un altro livello sopra di esso ... Mi piace l'idea di usando Linq nel mio livello di logica aziendale. (Ma questa è probabilmente una domanda per dopo) Grazie! –

2

Ciò è corretto. Entity Framework è un Object-Relational Mapper (ORM). Fornisce un modo per associare i tuoi oggetti a dati relazionali per l'interrogazione. IQueryable<T> viene utilizzato con EF e può fondamentalmente ottimizzare l'SQL inviato al e dal server.

1

No, non è corretto. Utilizzando i set di dati digitati, si aggiungerà una query con parametri al tableadapter come "SELECT * from Customers where name = @name" Fornirai il parametro name dal tuo codice in fase di runtime. In questo modo devi solo inserire i dati desiderati nel set di dati. Tirare per primo l'intero tavolo secondo la risposta di Reed sarebbe alquanto inefficiente e non realistico con un database di qualsiasi dimensione. Questo sembra essere un comune fraintendimento di ADO.Net, perpetuato anche in alcuni libri, in particolare libri su Entity Framework!

Problemi correlati