IQueryable<> partir d'une procédure stockée (entity framework)
Je veux obtenir IQueryable<>
résultat lors de l'exécution de la procédure stockée.
Ici, c'est la paix de code qui fonctionne très bien:
IQueryable<SomeEntitiy> someEntities;
var globbalyFilteredSomeEntities =
from se in m_Entities.SomeEntitiy
where
se.GlobalFilter == 1234
select se;
Je peux l'utiliser pour appliquer le filtre global, et plus tard utiliser le résultat d'une telle façon
result = globbalyFilteredSomeEntities
.OrderByDescending(se => se.CreationDate)
.Skip(500)
.Take(10);
Ce que je veux faire - utiliser certaines procédures stockées dans le filtre global.
J'ai essayé:
Ajouter procédure stockée pour m_Entities
, mais il renvoie IEnumerable<>
et exécute sp immédiatement:
var globbalyFilteredSomeEntities =
from se in m_Entities.SomeEntitiyStoredProcedure(1234);
Matérialiser requête à l'aide de EFExtensions de la bibliothèque, mais il est IEnumerable<>
.
Si j'utilise AsQueryable()
et OrderBy()
, Skip()
, Take()
et après que ToList()
pour l'exécution de cette requête
Je reçois exception que DataReader
est ouvert et j'ai besoin de fermer d'abord(ne peut pas coller de l'erreur - c'est en russe).
var globbalyFilteredSomeEntities =
m_Entities.CreateStoreCommand("exec SomeEntitiyStoredProcedure(1234)")
.Materialize<SomeEntitiy>();
//.AsQueryable()
//.OrderByDescending(se => se.CreationDate)
//.Skip(500)
//.Take(10)
//.ToList();
Aussi juste sauter .AsQueryable()
n'est pas utile - même une exception.
Quand j'ai mis ToList()
requête s'exécute,
mais c'est trop cher pour exécuter la requête, sans Skip()
, Take()
.
- Est-ce EF 4? Si oui, utiliser
ExecuteStoreQuery
, et puis vous n'aurez pas besoinMaterialize
. - Non, c'est EF 1, mais si
ExecuteStoreQuery
résout mon problème, je vais envisager de passer à EF4. Pouvez-vous partager quelques liens vers des articles spéciaux à ce sujet(si vous en avez). - J'ai vu stackoverflow.com/questions/2201369/... et il est indiqué qu'
ExecuteStoreQuery
retourneObjectResult
de la collection - même commem_Entities.SomeEntitiyStoredProcedure(1234);
. Semble queExecuteStoreQuery
ne permettra pas de résoudre mon problème. - OK, je vois ce que vous dites. Ce (
Take()
...) n'est pas possible, parce que si vous écrivez le SQL, l'EF ne peut plus composer que SQL. Toutefois, si vous ne l'utilisezExecuteStoreQuery
ensuite, vous pouvez utiliserTOP
et la comme dans le SQL que vous écrivez. - Ne
ExecuteStoreQuery
retourObjectResult
ou de retourObjectQuery
? Si elle renvoieObjectResult
- il est inutilisable pour moi.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas faire ce que vous essayez de faire, pour la même raison que vous ne pouvez pas mettre une procédure stockée dans une clause from d'une requête SELECT - SQL n'est pas construit pour soutenir ce genre d'opération.
Pouvez-vous mettre à la logique que vous voulez dans une vue à la place d'une procédure stockée?
Vous pouvez utiliser un projet que j'ai créé et appelé LinqToAnything qui vous permet de prendre une non-queryable méthode d'accès aux données et le transformer en un IQueryable.
J'ai un blog ici sur la façon de l'utiliser.
où énéralement vous pouvez obtenir autour de ces questions avec ToList()
Pourquoi ne pouvez-vous pas faire le Saut() et de Prendre() sur l'énumérable? Ceci vous permettra de télécharger uniquement les résultats qui sont ignorés ou pris, les autres ne soient pas lire.
Edit: La version précédente était simplement faux dans de nombreux aspects.
ToList()
requête s'exécute, mais il est trop cher pour exécuter la requête sansSkip()
,Take()
.