type tutorial the query net mvc framework first español constructed complex code cannot asp c# linq entity-framework

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)