2009-05-11 5 views
3

J'ai une méthode où j'exécuter une requête SQL (j'utilise LINQ to SQL, mais je dois exécuter une requête SQL classique), mais je ne sais pas de quelle table/entité cette requête sera générée.Comment puis-je retourner un IQueryable en C# 3.0 sans connaître son type?

Donc, je pensais que je ne sais pas de quelle table la requête sera générée à partir, je ne sais pas le genre de mon IQueryable, suis-je raison?

Mais je ne sais pas comment retourner ce IQueryable? J'ai essayé de retourner <T> mais ça ne marche pas.

Merci!

Répondre

1

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.

0

Vous ne pouvez pas que vous avez découvert. Puisque vous ne connaissez pas le type il n'y a aucun moyen de retourner un générique générique (ie. Liste) la seule autre option pour vous avec ce que vous faites (aussi chaque fois que vous voulez retourner un sous-ensemble d'un fort Linq type Sql) est de créer votre propre type (c'est-à-dire .. Class ou Struct) et de remplir une liste et de revenir que ... Je suppose que vous avez une idée des colonnes que vous retournez donc ça ne devrait pas être trop difficile.

Hope this helps Tab

Questions connexes