Ai-je vraiment besoin d'utiliser AsQueryable() de la collection?
Exemple de code:
List<Student> Students = new List<Student>()
{
new Student(101, "Hugo", "Garcia", new List<int>() { 91, 88, 76, 93 }),
new Student(102, "Rick", "Adams", new List<int>() { 70, 73, 66, 90 }),
new Student(103, "Michael", "Tucker", new List<int>() { 73, 80, 75, 88 }),
new Student(104, "Fadi", "Fakhouri", new List<int>() { 82, 75, 66, 84 }),
new Student(105, "Peter", "Barrows", new List<int>() { 67, 78, 70, 82 })
};
var query = from student in Students
where student.Marks.AsQueryable().All(m => m > 70)
select student;
foreach (Student student in query)
{
Console.WriteLine("{0} {1}<br />", student.FirstName, student.LastName);
}
Mais si je change la requête de
var query = from student in Students
where student.Marks.All(m => m > 70)
select student;
Cela fonctionne aussi et produit le même résultat, alors quelle est la différence?
Une question similaire sur
AsEnumerable
OriginalL'auteur Cheung | 2012-05-09
Vous devez vous connecter pour publier un commentaire.
IQueryable est obligatoire/conseillé pour les objets provenant de la source à distance (à l'instar de la base de données).
Dans la mémoire des collections, il est d'aucune utilité.
AsQueryable est utilisé lors de l'expression de l'arbre est construit.
Je pense scénario où il est le meilleur ajustement. Dans votre exemple, supposons que vous avez besoin de quelques informations de base de données en fonction d'identification de l'élève.
Maintenant étudiant est dans la mémoire de la collection. Vous avez besoin de feu de requête de base de données sur la carte d'étudiant.
Toute opération sur le studentList sera appelée à partir de IQueryAble interface ( expression de la requête), et va chercher uniquement les enregistrements de la source de données, qui doivent être retournés comme définitive du résultat de la requête (tant que source de données, la valeur de retour de
remoteDBProvider.GetInfo
dans l'exemple, prend en charge QueryProvider).Vous avez raison, commentaire supprimé car il induit en erreur (ou tout simplement faux). Néanmoins,
AsQueryable
a encore c'est utilise même pour la mémoire collections, car c'estSelect
extension de la méthode accepte unExpression<Func>
, qui permet d'analyser ou de le modifier. Un scénario est, je pense, à l'aide de la collection en mémoire enveloppé dans unIQueryable
comme un moyen pour une persistance n'est pas au courant de la couche d'envoyer une requête comme une AST pour un compatible avec la persistance de la couche.OriginalL'auteur Tilak
Il a à faire, comment l'expression de l'arbre est en construction. Regardez ceci:
Référence ici
OriginalL'auteur Arion
Dans le cas de votre
List<Student>
, il ne fait aucune différence, comme le retour de l'IQueryable<T>
va utiliser les mêmes méthodes d'interrogation comme si vous n'aviez pas utiliséAsQueryable()
à tous.Certaines Méthodes s'attendre à une
IQueryable<T>
paramètre. Je pense que leAsQueryable()
extension de la méthode est principalement utile pour ces scénarios, quand vous en avez besoin pour passer unIQueryable<T>
mais seulement uneIEnumerable<T>
.MSDN dit à propos de
AsQueryable
:Ce qui signifie que dans votre cas (
List<T>
ne pas mettre en œuvreIQueryable<T>
), vous n'avez pas vraiment besoinAsQueryable
.OriginalL'auteur Botz3000