J'ai besoin d'écrire LINQ dynamique où je ne sais rien de la table d'entrée - fournisseur de données (c'est pourquoi j'utilise LINQ to SQL), pas de nom de table, rien. Je veux pouvoir interroger les données en fonction des champs sélectionnés par l'utilisateur et des valeurs données, quelque chose comme ceci:
Avoir une String
TheTableName
et System.Data.Linq.DataContext
TheContext
:
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 correct de ITable
l' ITable
en un IEnumerable<object>
comme je l'ai fait ici?
Remarque ITable
provient de System.Data.Linq
, https://msdn.microsoft.com/en-us/library/system.data.linq.itable(v=vs.110).aspx
Réponse courte
NON.
Longue réponse
ITable
a cette signature:
public interface ITable : IQueryable, IEnumerable
Si vous avez une instance d'un type qui implémente cela, comme ci-dessous:
public class MyTable : System.Data.Linq.ITable
{
// Implementation ...
}
Et vous faites ceci:
var myTable = new MyTable();
var iterator = myTable as IEnumerable<Object>;
Il renverra null car MyTable
implémente ITable
et les deux ITable
pas d'interface IEnumerable<T>
.
Cependant, cela fonctionnera:
var iterator = myTable as IEnumerable; // or IQueryable
Donc, selon ce que vous entendez par, Is it correct to cast the ITable to an IEnumerable<object> as I've done here
. Il ne lèvera pas d'exception, mais il ne résultera en rien jusqu'à ce que vous l'utilisiez et il explosera avec une exception de référence nulle sur cette ligne:
query = query.Where(whereField + "=" + whereValue);