J'ai commencé à examiner la structure réactive. Très bon truc. Mais en regardant des échantillons de code, cela m'a rendu confus. La syntaxe linq fonctionne avec IQueryable. Je pensais que linq ne fonctionne qu'avec IEnumerable. Sur quoi le compilateur C# base-t-il ses conversions linq en méthodes d'extension? Cela nécessite-t-il un ensemble de méthodes avec une interface spécifique?Comment la syntaxe linq fonctionne-t-elle via l'interface IQueryable dans Rx Framework?
Répondre
Pas tout à fait. C'est juste une traduction syntaxique. Par exemple, le compilateur traduire:
var query = from item in source
select item.Property;
dans
var query = source.Select(item => item.Property);
Il le fait sans rien savoir sur la méthode Select
. Il fait juste la traduction, puis essaie de compiler le code traduit.
Toutes les traductions sont soigneusement documentées dans la section 7.16 de la spécification C# 4 (et l'équivalent pour les éditions antérieures, bien sûr). Dans le cas de Rx, il appelle les extensions IObservable<T>
et IQbservable<T>
. Dans le cas de Parallel Extensions, il appelle les méthodes d'extension sur ParallelQuery<T>
.
Vous pouvez faire quelques fou stuff avec elle - J'ai un blog post qui donne quelques exemples. Voici un autre impair:
using System;
using System.Linq;
namespace CornerCases
{
class WeirdQueryExpression
{
static WeirdQueryExpression Where(Func<int, int> projection)
{
return new WeirdQueryExpression { Select = ignored => "result!" };
}
Func<Func<string, bool>, string> Select { get; set; }
static void Main()
{
string query = from x in WeirdQueryExpression
where x * 3
select x.Length > 10;
Console.WriteLine(query);
}
}
}
La requête se traduit par:
WeirdQueryExpression.Where(x => x * 3)
.Select(x => x.Length > 10);
... qui est un appel à une méthode statique qui retourne un WeirdQueryExpression
, puis en accédant à la propriété Where
qui retourne une Func<Func<string, bool>, string>
. Nous puis appel qui déléguer (passer dans un autre délégué) et affecter le résultat à query
.
Génial, hein?
Juste pour ajouter (afin d'aider l'OP), LINQ trouve les méthodes d'extension pour IQueryable via la classe Queryable: http: //msdn.microsoft.com/en-us/library/system.linq.queryable.aspx –
LINQ a toujours travaillé avec 'IQueryable' et' IEnumerable'. –