8

Ich möchte IQueryable<> Ergebnis erhalten, wenn gespeicherte Prozedur ausgeführt wird.IQueryable <> aus gespeicherter Prozedur (Entitätsframework)

ist hier Frieden Code, der gut funktioniert:

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

Ich kann diese globale Filter anzuwenden, verwenden und die spätere Verwendung Ergebnis in einer solchen Art und Weise

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

Was will ich - Verwende einige gespeicherte Prozeduren im globalen Filter.
Ich habe versucht:

Add gespeicherte Prozedur m_Entities, aber es gibt IEnumerable<> und führt sp sofort:

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

Materialise Abfrage EFExtensions Bibliothek, aber es ist IEnumerable<>.
Wenn ich AsQueryable() und OrderBy(), Skip(), Take()
und danach ToList() diese Abfrage auszuführen -
ich Ausnahme, dass DataReader offen ist und ich brauche um es zu schließen ersten (nicht Fehler ein - es ist in russischen).

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

auch nur das Überspringen .AsQueryable() ist nicht hilfreich - gleiche Ausnahme.
Wenn ich ToList() Abfrage ausführt,
, aber es ist zu teuer, Abfrage ohne Skip(), Take() auszuführen.

+0

Ist das EF 4? Wenn ja, benutze 'ExecuteStoreQuery', und dann brauchst du' Materialize' nicht. –

+0

Nein, es ist EF 1, aber wenn 'ExecuteStoreQuery' mein Problem löst, werde ich in Erwägung ziehen, zu EF4 zu wechseln. Kannst du Links zu einigen speziellen Artikeln darüber teilen (falls du solche hast). –

+0

Ich sah http: // stackoverflow.com/questions/2201369/entity-framework-objectcontext-executestorequery-products-detached-objects und es wird angegeben, dass 'ExecuteStoreQuery' 'ObjectResult' collection zurückgibt - genau wie' m_Entities.SomeEntiyStoredProcedure (1234); '. So scheint 'ExecuteStoreQuery' mein Problem nicht zu lösen. –

Antwort

7

Sie können nicht tun, was Sie versuchen, aus dem gleichen Grund, dass Sie eine gespeicherte Prozedur in eine FROM-Klausel einer SELECT-Abfrage nicht einfügen können - SQL ist nicht zur Unterstützung dieser Art von Vorgang erstellt .

Können Sie die gewünschte Logik in eine Ansicht statt in eine gespeicherte Prozedur einfügen?

+0

Schöne Idee. Wird EF dieselbe Art von Entität aus der Ansicht zurückgeben, oder muss ich noch einige Schritte tun, um das zu erreichen? Cane Sie teilen einige Code-Snippet arbeiten mit View in ef? –

+0

Ohne EF ist es kein Problem, das zu tun, was er will. – erikkallen

+0

Wäre schön, Anwendungsbeispiel der Datenbankansicht in EF zu sehen. Ich bin nicht daran interessiert, es ohne EF zu tun. –

-1

sually können Sie rund um diese Themen mit ToList erhalten()

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

Warum können Sie das Überspringen nicht tun() und Take() auf der zählbare? Dadurch werden nur die Ergebnisse heruntergeladen, die übersprungen oder genommen wurden, die anderen werden nicht gelesen.

Bearbeiten: Die vorherige Version war in vielen Aspekten falsch.

+0

Es ist nicht das, wonach ich suche. Wenn ich die 'ToList()' Abfrage ausführt, ist es zu teuer, die Abfrage ohne 'Skip()', 'Take()' auszuführen. –

+0

Die AsEnumerable() Lösung sollte in diesem Fall (nach dem Bearbeiten) den Trick tun – erikkallen

+0

(Erikkallen) Aber es ist bereits IEnumerable. –

1

Sie können ein von mir erstelltes Projekt mit der Bezeichnung LinqToAnything verwenden, mit dem Sie eine nicht abfragbare Datenzugriffsmethode erstellen und in ein IQueryable verwandeln können.

Ich habe einen Blogpost here auf, wie man es benutzt.