Vous pouvez construire le IQueryable<T>
intérieur d'une méthode et ensuite faire la méthode générique. Si vous avez fait cela, alors vous seriez en mesure de retourner IQueryable<T>
directement et le compilateur C# pouvez utiliser pour déterminer type Inference ce T
était au moment de la compilation. C'est effectivement ainsi que la plupart des opérateurs Linq sont construits, sauf qu'ils sont implémentés en tant que méthodes d'extension.
Par exemple, considérons la méthode qui supprime toute la liste qui sont la valeur par défaut pour ce type:
public static IQueryable<T> FilterDefaults<T>(IQueryable<T> theSet)
{
IQueryable<T> query =
from t in theSet
where t != default(T)
select t;
return query;
}
Maintenant, lorsque vous appelez cela en C#, vous pouvez laisser tomber le <T>
puisque l'inférence de type peut comprendre T
à la compilation d'être encore fortement typé:
string[] myStrs = { "ABC", null, "", "123", null, "XYZ" };
var theFilteredStrs = FilterDefaults(myStrs);
// should represent the sequence: "ABC", "", "123", "XYZ"
// note null is missing because default(string) is null
int[] myNums = { -1, 0, 3, 0, 42 };
var theFilteredNums = FilterDefaults(myNums);
// should represent the sequence: -1, 3, 42
// note 0 is missing because default(int) is 0
Ceci est un exemple trivial qui utilise uniquement les types de base, mais l'idée fonctionne de la même pour toute utilisation LINQ (y compris LINQ to SQL) qui est la puissance de LINQ. Il ne se soucie pas si vous allez utiliser LINQ-to-SQL ou si c'est LINQ-to-Objects.