2017-02-19 2 views
0

Je dois écrire LINQ dynamique où je ne sais rien à propos de la table d'entrée - fournisseur de données (ce qui explique pourquoi j'utilise LINQ to SQL), pas de tableau nom, rien. Je veux être en mesure d'interroger les données fournies champs sélectionnés par l'utilisateur et les valeurs données, quelque chose comme ce qui suit:Cast ITable à IEnuerable <object> - Dynamic LINQ to SQL requête sans informations DataTable

Avoir un StringTheTableName et System.Data.Linq.DataContextTheContext:

IEnumerable<object> GetQuery(List<string> theWhereFields, List<string> theWhereValues) 
    { 
     // for doing dynamically ala http://stackoverflow.com/a/25859319/3661120    

     var baseTable = (ITable)TheContext.GetType() 
          .GetProperty(TheTableName).GetValue(TheContext, null); // http://stackoverflow.com/a/1924966/3661120      

     IEnumerable<object> query = (IEnumerable<object>) baseTable; 
     for (int i = 0; i < theWhereFields.Count; i++) 
     { 
      var whereField = theWhereFields[i]; 
      var whereValue = theWhereValues[i]; 
      query = query.Where(whereField + "=" + whereValue); // possible due to System.Linq.Dynamic 
     } 

     return query;    
    } 

Est-il exact de réunir la ITable à un IEnumerable<object> comme je l'ai fait ici?

Remarque ITable est de System.Data.Linq, https://msdn.microsoft.com/en-us/library/system.data.linq.itable(v=vs.110).aspx

+0

ce qui est 'ITable'? – CodingYoshi

+0

Voir ici: https://msdn.microsoft.com/fr-fr/library/system.data.linq.itable(v=vs.110).aspx. C'est IQueryable, mais pas nécessairement IEnumerable. – dashnick

+0

TheContext est le DataSet alors comment savez-vous quelle table vous voulez? – jdweng

Répondre

1

Réponse courte

NO.

Réponse longue

ITable a cette signature:

public interface ITable : IQueryable, IEnumerable 

Si vous avez une instance d'un type qui met en œuvre qui, comme ci-dessous:

public class MyTable : System.Data.Linq.ITable 
{ 
    // Implementation ... 
} 

Et vous faites cela :

var myTable = new MyTable(); 
var iterator = myTable as IEnumerable<Object>; 

Il renverra null parce que MyTable implémente ITable et les deux n'implémentent pas l'interface IEnumerable<T>.

Cependant, cela fonctionnera:

var iterator = myTable as IEnumerable; // or IQueryable 

donc en fonction de ce que vous entendez par Is it correct to cast the ITable to an IEnumerable<object> as I've done here. Il ne va pas faire exception, mais il ne sera jamais un résultat autre jusqu'à ce que vous l'utilisez et il soufflera avec une exception de référence null sur cette ligne:

query = query.Where(whereField + "=" + whereValue); 
+0

D'accord, merci. Je suppose que je vais juste utiliser 'IQueryable'. – dashnick