Quiero llegar IQueryable<> resultado al ejecutar el procedimiento almacenado.

Aquí es la paz de código que funciona bien:

IQueryable<SomeEntitiy> someEntities;  
var globbalyFilteredSomeEntities = 
  from se in m_Entities.SomeEntitiy
    where
      se.GlobalFilter == 1234 
  select se;

Puedo usar esto para aplicar el filtro global, y más tarde los resultados de uso de tal manera

result = globbalyFilteredSomeEntities
  .OrderByDescending(se => se.CreationDate)
  .Skip(500)
  .Take(10);

Lo que yo quiero hacer uso de algunos procedimientos almacenados en el filtro global.
He intentado:

Añadir procedimiento almacenado para m_Entities, pero devuelve IEnumerable<> y ejecuta sp inmediatamente:

var globbalyFilteredSomeEntities = 
  from se in m_Entities.SomeEntitiyStoredProcedure(1234);

Materializar consulta mediante EFExtensions de la biblioteca, pero es IEnumerable<>.
Si yo uso AsQueryable() y OrderBy(), Skip(), Take()
y después de que ToList() para ejecutar esa consulta –
Puedo obtener excepción de que DataReader está abierto y tengo que cerrar primero(no se puede pegar error – es en ruso).

var globbalyFilteredSomeEntities = 
  m_Entities.CreateStoreCommand("exec SomeEntitiyStoredProcedure(1234)")
            .Materialize<SomeEntitiy>();
            //.AsQueryable()
            //.OrderByDescending(se => se.CreationDate)
            //.Skip(500)
            //.Take(10)
            //.ToList();   

También acaba de saltar .AsQueryable() no es útil – la misma excepción.
Cuando me pongo ToList() consulta se ejecuta,
pero es demasiado caro para ejecutar la consulta sin Skip(), Take().

Es este EF 4? Si es así, utilice ExecuteStoreQuery, y entonces usted no tendrá que Materialize.
No, es EF 1, pero si ExecuteStoreQuery resuelve mi problema, voy a considerar mudarse a EF4. Puedes compartir los enlaces a algunos artículos especiales sobre eso(si tiene).
Vi stackoverflow.com/questions/2201369/… y se afirma que ExecuteStoreQuery devuelve ObjectResult colección – mismo como m_Entities.SomeEntitiyStoredProcedure(1234);. Así que parece que ExecuteStoreQuery no va a resolver mi problema.
OK, ya veo lo que estás diciendo. Este (Take()…) no será posible, porque si escribir el SQL, el EF no puede componer de SQL. Sin embargo, si uso ExecuteStoreQuery entonces uso TOP y al igual que en el SQL que usted escribe.
Hizo ExecuteStoreQuery volver ObjectResult o volver ObjectQuery? Si devuelve ObjectResult – es inútil para mí.

OriginalEl autor arena-ru | 2010-05-05

3 Comentarios

  1. 8

    Que no puedes hacer lo que estamos tratando de hacer, por la misma razón que no se puede poner un procedimiento almacenado en una cláusula FROM de una consulta SELECT – SQL no está construido para soportar este tipo de operación.

    Podría poner la lógica que usted desea en una vista en lugar de un procedimiento almacenado?

    Muy buena idea. Se EF retorno de un mismo tipo de entidad de la vista, o tengo que realizar algunos pasos más para lograr eso? La caña de compartir algunos fragmentos de código de trabajo con la vista en ef?
    Sin FE, no hay ningún problema en hacer lo que él quiere, sin embargo.
    Sería agradable ver un ejemplo de uso de la Vista de Base de datos en EF. Yo no estoy interesado en hacerlo sin EF.
    Soporte para funciones con valores de tabla se ha añadido .NET 4.5 y EF5. Cambiar su proc almacenado en un TVF y usted puede utilizar el código de esta respuesta.

    OriginalEl autor

  2. 1

    Puede utilizar un proyecto que he creado llamado LinqToAnything que le permite tomar una no-que se puede consultar método de acceso a datos y convertirlo en un IQueryable < t>.

    Tengo un blog aquí sobre cómo utilizarlo.

    OriginalEl autor

  3. -3

    sually usted puede conseguir alrededor de estos temas, con ToList()

    var globbalyFilteredSomeEntities = m_Entities.CreateStoreCommand("exec SomeEntitiyStoredProcedure(1234)") 
                                                 .Materialize<SomeEntitiy>()
                                                 .ToList()  // <<-- added this.
                                                 .WhateverYouWant();

    ¿Por qué no puede hacer el Skip() y Tomar() en el enumerable? Haciendo esto solo descarga los resultados que se omiten o se toman, los otros no se puede leer.

    Edición: La versión anterior estaba completamente equivocada en muchos aspectos.

    No es lo que estoy buscando. Cuando me pongo ToList() consulta se ejecuta, pero es demasiado caro para ejecutar la consulta sin Skip(), Take().
    El AsEnumerable() solución debe hacer el truco en este caso (después de editar)
    (A erikkallen) Pero ya es IEnumerable.

    OriginalEl autor

Dejar respuesta

Please enter your comment!
Please enter your name here