c# - tutorial - mvc entity framework español
¿Qué declaraciones de LINQ obligan a Entity Framework a regresar de la base de datos? (4)
Conozco varias declaraciones de LINQ que harán que EF evalúe y devuelva los resultados del DB a la memoria. .ToList()
es uno. ¿Alguien tiene una lista completa de las declaraciones que hacen esto?
No estoy seguro de ...
.SingleOrDefault()
.Union()
EDITAR: Ojalá pudiera aceptar todas estas respuestas. Gran información de todos!
Desde MSDN ,
Las consultas que realizan funciones de agregación en un rango de elementos de origen primero deben iterar sobre esos elementos.
Ejemplos de tales consultas son Count , Max , Average y First . Estos se ejecutan sin una instrucción foreach explícita porque la consulta en sí misma debe usar foreach para devolver un resultado.
Tenga en cuenta también que estos tipos de consultas devuelven un solo valor, no una colección IEnumerable .
Para forzar la ejecución inmediata de cualquier consulta y almacenar en caché sus resultados, puede llamar a los métodos ToList <TSource> o ToArray <TSource> .
En el caso de Entity Framework, hay una manera fácil de actualizar su memoria.
Entity Framework tiene variantes Async
de todos estos métodos definidos en System.Data.Entity
, porque Async
no tiene sentido con los demás, ya que es el mero hecho de consultar la base de datos que las variantes asíncronas realizan de forma asíncrona.
Entonces, si hay una variante de Async
, entonces llega a la base de datos y, de lo contrario, no lo hace.
IEnumerable<T>
o producir un IEnumerable<T>
es un caso parcial aunque: el acto de obtener un IEnumerable<T>
obteniendo su enumerador (como sucede al inicio de los bloques foreach
) no llega a la base de datos, pero el primer MoveNext()
(lo que sucede inmediatamente dentro del foreach
llega a la base de datos, y luego continúa transmitiéndose desde el conjunto de resultados hasta que MoveNext()
devuelva falso (como cuando el foreach
alcanza un extremo "natural") o el enumerador se elimine antes de que (como cuando el foreach
es abortado).
Es una list larga. Se reducen a
Aggregate
All<TSource>
Any
Average
Contains
Count
ElementAt<TSource>
ElementAtOrDefault<TSource>
Empty<TResult>
First
FirstOrDefault
Last
LastOrDefault
LongCount
Max
Min
SequenceEqual
Single
SingleOrDefault
Sum
ToArray<TSource>
ToDictionary
ToList<TSource>
ToLookup
El resto son Ejecución de transmisión diferida o Ejecución diferida sin transmisión.
A la luz de su pregunta, SingleOrDefault()
es la ejecución inmediata y Union()
es la ejecución de transmisión diferida.
Todo lo que devuelve un objeto concreto o estructura de datos ( Count
, Sum
Single
, First
, ToList
, ToArray
, etc.) se evalúa de inmediato, por lo que SingleOrDefault
sí lo hace.
Todo lo que devuelva un IQueryable<T>
( Select
, GroupBy
, Take
) será diferido (para que las operaciones puedan ser encadenadas), por lo que Queryable.Union
será diferido.
Cualquier cosa que devuelva un IEnumerable<T>
también se aplazará, pero las consultas posteriores se realizarán en Linq-to-objetos, por lo que las operaciones subsiguientes no se traducirán a SQL. ( Empty
es una excepción, ya que realmente no hay nada que diferir, solo devuelve una colección vacía)