IQueryable <> à partir d'une procédure stockée (structure d'entité)

.net entity-framework iqueryable linq-to-entities stored-procedures

Question

Je souhaite obtenir le résultat IQueryable<> lors de l'exécution d'une procédure stockée.

Voici la paix du code qui fonctionne bien:

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

Je peux l'utiliser pour appliquer un filtre global et utiliser le résultat ultérieurement de telle manière

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

Ce que je veux faire - utiliser des procédures stockées dans le filtre global.
J'ai essayé:

Ajoutez une procédure stockée à m_Entities , mais il retourne IEnumerable<> et exécute sp immédiatement:

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

Matérialiser la requête à l'aide de la bibliothèque EFExtensions, mais il s'agit de IEnumerable<> .
Si j'utilise AsQueryable() et OrderBy() , Skip() , Take()
et après cela ToList() pour exécuter cette requête -
Je suis excepté que DataReader est ouvert et que je dois d'abord le fermer (impossible de coller l'erreur - il est en russe).

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

Il est également .AsQueryable() sauter. .AsQueryable() - même exception.
Quand je mets ToList() requête s'exécute,
mais il est trop coûteux d'exécuter une requête sans Skip() , Take() .

Réponse acceptée

Vous ne pouvez pas faire ce que vous essayez de faire, pour la même raison que vous ne pouvez pas mettre de procédure stockée dans une clause FROM d'une requête SELECT - SQL n'est pas conçu pour prendre en charge ce type d'opération.

Pourriez-vous mettre la logique que vous voulez dans une vue au lieu d'une procédure stockée?


Réponse populaire

Vous pouvez utiliser un projet que j'ai créé et appelé LinqToAnything, qui vous permet de transformer une méthode d'accès aux données non interrogeable en une application IQueryable.

J'ai un article de blog ici sur la façon de l'utiliser.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow