2010-07-28 12 views
6

Estoy comparando los conjuntos de datos EF y mecanografiados por su utilidad. Estaba fallando en ver por qué usarías el EF sobre los conjuntos de datos tipeados si el EF está ligado solo al Servidor SQL. Pero es cierto que las declaraciones de Linq en EF se evalúan tarde en el respeto que si se hizo algo como:¿Puede alguien aclarar la diferencia clave entre Entity Framework y Typed Datasets?

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

El EF hiciese una consulta como:

select * from Customers where Name = 'John smith' 

pero con conjuntos de datos con tipo podría escribir:

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

que es muy similar, pero la diferencia es primero ejecuta:

select * from Customers 

Y luego, utilizando la biblioteca de colecciones estándar encuentra las filas que contienen el nombre: "John Smith". En teoría, significa que EF será más eficiente.

¿Es esto correcto?

+0

Buena pregunta simple que ilustra un punto que puede no ser inmediatamente obvio. –

+0

EF - Buenos conjuntos de datos tipados - Blaaaaah. – zmbq

Respuesta

4

Sí. Con Entity Framework, usa IQueryable<T> para construir sus consultas. Al hacer:

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

Internamente, los resultados serán IQueryable<Customer> (o su tipo). Esto le permite al proveedor (EF) optimizar la forma en que se ejecuta internamente. En el caso de SQL Server, la consulta real enviada al servidor tendrá ya la cláusula SQL WHERE, lo que a su vez significará que solo devolverá un solo registro (si "Nombre" es único) de la BD en su lugar de cada registro.

Utilizando conjuntos de datos tipados, devolverá cada registro, luego buscará los resultados para el nombre apropiado después. Esto es potencialmente mucho menos eficiente.

+0

Estupendo, este era el tipo de respuesta que estaba buscando :) Ahora quiero saber si utilizo EF como mi capa de acceso a datos o si lo resumen con otra capa encima ... Me gusta la idea de usando Linq en mi capa de lógica de negocios. (Pero esta es probablemente una pregunta para más tarde) ¡Gracias! –

2

Eso es correcto. Entity Framework es un Object Relational Mapper (ORM). Proporciona una forma de asignar sus objetos a una información relacional para consultar. IQueryable<T> se usa con EF y básicamente puede optimizar el SQL que se envía ay desde el servidor.

1

No, no es correcto. Al usar conjuntos de datos tipeados, agregaría una consulta de parámetros al compilador de tablas, como 'SELECCIONAR * de Clientes donde nombre = @nombre' Debería proporcionar el parámetro de nombre de su código en tiempo de ejecución. De esta forma, solo extraerá los datos que desea en el conjunto de datos. Traer toda la tabla primero según la respuesta de Reed sería tremendamente ineficiente en el mejor de los casos y no realista con una base de datos de cualquier tamaño. Esto parece ser un malentendido común de ADO.Net, perpetuado incluso en algunos libros, especialmente libros sobre Entity Framework.

Cuestiones relacionadas