2011-08-25 14 views
19

Normalmente uso el término entity para representar un objeto de datos profesionales y en mi opinión, el linq to entities y el linq to objects eran lo mismo. ¿No es eso correcto?linq a entidades vs linq a objetos - ¿son lo mismo?

+1

Consulte también: ¿qué es linq? http://stackoverflow.com/questions/471502/what-is-linq/471592#471592 –

Respuesta

42

que definitivamente no es el caso.

LINQ-to-Objects es un conjunto de métodos de extensión en IEnumerable<T> que le permiten realizar operaciones de consulta en memoria en secuencias arbitrarias de objetos. Los métodos aceptan delegados simples cuando sea necesario.

LINQ-to-Entities es un proveedor de LINQ que tiene un conjunto de métodos de extensión en IQueryable<T>. Los métodos crean un árbol de expresiones (por lo que los delegados se pasan realmente como Expression<> s) y el proveedor creará una consulta SQL en función de su análisis sintáctico de ese árbol de expresiones.

Como ejemplo, considere las siguientes preguntas:

var query1 = mydb.MyEntity.Select(x => x.SomeProp).Where(x => x == "Prop"); 
var query2 = mydb.MyEntity.Select(x => x.SomeProp).AsEnumerable().Where(x => x == "Prop"); 

La primera consulta es la voluntad de construir un árbol de expresión que consiste en un grupo selecto y donde, con los dos lambdas realmente considerados como LambdaExpression s. El proveedor de LINQ-a-Entidades traducirá eso en SQL que tanto selecciona como filtra.

La segunda consulta inserta un AsEnumerable(), lo que obligará al resto de la consulta a utilizar LINQ-to-Objects. En ese caso, el proveedor generará SQL basado solo en la selección, devolverá todos esos registros desde la base de datos, y luego el filtrado ocurrirá en la memoria. Obviamente, eso va a ser mucho más lento.

+1

¿Hay alguna manera de filtrar en ambas condiciones para una consulta de linq a objeto o siempre se está reduciendo a la primera acción antes de procesar el ¿siguiente? –

+1

Depende; si solo desea obtener * todos * los registros de una base de datos y luego realizar acciones en ellos en la memoria, puede poner 'AsEnumerable()' * antes * de 'Seleccionar()' y luego haga lo que desee. En general, sin embargo, es una mejor idea mantener las cosas separadas. Si tiene un 'IEnumerable ', entonces usará LINQ-to-Objects. De lo contrario, la base de datos probablemente sea más eficiente. – dlev

+0

@dlev no respondiste lo que pidió. –

7

Linq to entities está destinado a ser utilizado con Entity Framework mientras que Linq to objects es para cualquier colección de IEnumerable.

Más detalles:

  1. Linq to Entities
  2. Linq to Objects
2

Linq2Entities soportes para la consulta de datos a través de ADO.NET Entity Framework (base de datos)

Linq2Objects soportes para la consulta de datos de la memoria (objetos locales).

10

L2o es para objets en memoria. L2e consulta una base de datos.

7

Linq a Objetos El término "LINQ a Objetos" se refiere a la utilización de las consultas LINQ con cualquier colección IEnumerable o IEnumerable directamente, sin el uso de un proveedor de LINQ intermedio o API como LINQ a SQL o LINQ to XML. Puede usar LINQ para consultar cualquier colección enumerable como Lista, Matriz o Diccionario. La colección puede ser definida por el usuario o puede ser devuelta por .NET Framework API.

En un sentido básico, LINQ to Objects representa un nuevo enfoque para las colecciones. A la antigua, tenía que escribir complejos bucles foreach que especificaban cómo recuperar datos de una colección. En el enfoque LINQ, escribe un código declarativo que describe lo que desea recuperar.

ref: http://msdn.microsoft.com/en-us/library/bb397919.aspx

LINQ to Entidad LINQ a Entidades proporciona apoyo Language-Integrated Query (LINQ) que permite a los desarrolladores escribir consultas en el modelo conceptual de Entity Framework utilizando Visual Basic o Visual C#. Las consultas contra Entity Framework están representadas por consultas de árbol de mandatos, que se ejecutan en el contexto del objeto. LINQ to Entities convierte consultas de consultas integradas en el lenguaje (LINQ) en consultas de árbol de comandos, ejecuta las consultas en el marco de la entidad y devuelve objetos que pueden ser utilizados tanto por Entity Framework como por LINQ. El siguiente es el proceso para crear y ejecutar una consulta de LINQ a Entidades: Ref: http://msdn.microsoft.com/en-us/library/bb386964.aspx