La façon la plus rapide à remplir Table de requête LINQ à l'aide de DataContext
Je suis en train de lancer une requête linq mais j'ai besoin de la suite comme un datatable que je l'utilise pour stocker les enregistrements de différentes requêtes dans le même état d'affichage de l'objet.
Les 2 versions en dessous de la compilation, mais le retour à un ensemble vide. L'erreur exacte est "Valeur ne peut pas être null.
Nom du paramètre: source". (et oui, j'ai vérifié qu'il y a des données):
MyDatabaseDataContext db = new MyDatabaseDataContext(conn);
IEnumerable<DataRow> queryProjects =
(from DataRow p in db.STREAM_PROJECTs.AsEnumerable()
where p.Field<int>("STREAM_ID") == StreamID
select new
{
PROJECT_ID = p.Field<int>("PROJECT_ID"),
PROJECT_NAME = p.Field<string>("PROJECT_NAME")
}) as IEnumerable<DataRow>;
DataTable results = queryProjects.CopyToDataTable<DataRow>();
...
//(from p in db.STREAM_PROJECTs.AsEnumerable()
//where p.STREAM_ID == StreamID
//select new
//{
// p.PROJECT_NAME,
// p.PROJECT_ID
//}) as IEnumerable<DataRow>;
Les exemples de cette fil ne semble pas fonctionner dans cette situation.
Je suppose que je pourrais juste exécuter une requête sql de commande à l'ancienne, mais ce n'est pas linq censé être plus rapide?
OriginalL'auteur JumpingJezza | 2011-02-10
Vous devez vous connecter pour publier un commentaire.
Votre problème est le suivant:
La
as
mot-clé effectue un coffre-fort fonte, pas une conversion, il semble que vous pourriez penser qu'il est en train de faire. Leas
mot-clé est sémantiquement équivalent à faire ceci:À l'exception de la version avec
as
ne lèvera une exception lorsqu'il ne parvient pas à lancer votre requête de l'objet (qui est unIQueryable<T>
, oùT
est un type anonyme) à unIEnumerable<DataRow>
(qui n'est pas).Malheureusement, il n'est pas intégré dans la méthode que je suis conscient de qui va prendre une énumération d'un type concret (comme votre type anonyme dans cet exemple) et de le transformer en un
DataTable
. L'écriture de l'un ne devrait pas être trop compliqué, comme vous pouvez vous essentiellement besoin pour obtenir les propriétés reflectively puis itérer sur la collecte et l'utilisation de ces propriétés pour créer des colonnes dans unDataTable
. Je vais poster un exemple en quelques.Quelque chose comme cela, placé dans une classe statique dans un espace de noms que vous êtes
using
, devrait fournir une méthode d'extension qui permettra de faire ce que vous voulez:Oui;
as
est pour être utilisé dans les cas où vous savez que l'objet peut ne pas être le type que vous êtes enceinte et ce n'est pas une "exceptionnelle". Leas
mot-clé évalue ànull
si le casting n'est pas valide, et (en conséquence) peut être utilisé uniquement avec les types de référence etNullable<T>
. Voir l'edit j'ai posté juste pour un exemple de méthode d'extension qui peut transformer n'importe quelIEnumerable<T>
à unDataTable
.Parfait! En Plus j'ai trouvé quelque chose de nouveau sur
as
🙂J'avais construit un chèque pour les Types Nullables depuis la sortie.Les colonnes.Ajouter un appel échouera si le type est nullable
OriginalL'auteur Adam Robinson