Requête LINQ to entities pour DataTable
J'ai besoin de stocker les données renvoyées par la requête LINQ to entities (ci-dessous) dans un DataTable, de sorte que je peux l'utiliser comme source de données pour un DataGridView, comment puis-je le faire?
Dans ce cas, je suis en utilisant LINQ to entities une requête à l'encontre d'une Entité Cadre conceptuel du modèle, de sorte db
est une classe qui hérite de System.Data.Entity.DbContext
.
using (TccContext db = new TccContext())
{
var query = from vendedor in db.Vendedores.AsEnumerable()
where vendedor.codigo == Convert.ToInt32(textBoxPesquisa.Text)
select vendedor;
//I'd like to do something like DataTable dt = query;
}
J'ai essayé de faire ce (ci-dessous), mais il déclenche une exception lors de l'exécution [1].
using (TccContext db = new TccContext())
{
IEnumerable<DataRow> query = (IEnumerable<DataRow>)(from vendedor in db.Vendedores.AsEnumerable()
where vendedor.codigo == Convert.ToInt32(textBoxPesquisa.Text)
select vendedor);
using (DataTable dt = query.CopyToDataTable<DataRow>())
{
this.dataGridViewProcura.Rows.Add(
dt.Rows[0][0], //Código
dt.Rows[0][1], //Nome
dt.Rows[0][2]); //Venda Mensal
}
}
[1]: Exception: InvalidCastException
Unable to cast object of type 'WhereEnumerableIterator`1[Projeto_TCC.Models.Vendedor]' to type 'System.Collections.Generic.IEnumerable`1[System.Data.DataRow]'.
Merci d'avance
OriginalL'auteur Zignd | 2013-08-25
Vous devez vous connecter pour publier un commentaire.
Il y a une chose importante ici, vous lancez votre requête Linq (
IEnumerable<DataRow>
) lorsque vous sélectionnez levendedor
, donc je suppose que c'vendedor est une instance deVendedor
, de sorte que votre requête renverra unIEnumerable<Vendedor>
Qui devrait résoudre votre problème, mais aussi, pouvez-vous essayer généré à l'aide de la Table de données comme source de données pour votre DataGridView? Il serait quelque chose comme ceci:
Espère que je peux aider!
MODIFIER
Que d'un côté (et très personnel), vous pouvez essayer d'utiliser des lambdas sur votre sélectionnez, ils ont l'air plus joli 🙂
Beaucoup plus propre, vous ne pensez pas?
EDIT 2
Je viens de réaliser ce que vous avez dit sur CopyToDataTable être pour DataRow seulement, de sorte que le dernier (certes pas très propre) solution serait d'imiter la logique de l'accompagnateur?
Maintenant, choses à considérer:
Alors que cela pourrait résoudre le problème, je ne pense pas que c'est une très bonne approche, mais il pourrait être le début d'une vie décente idée 🙂
J'espère que je peux aider cette fois!
query
si je l'utilise comme ça. Veuillez noter que je suis en utilisant Entity Framework.J'ai fait une faute de frappe sur la dernière source, et de les éditer dit, la CopyToDataTable méthode doit y travailler. btw - N'a la réponse a aidé?
Comme vous pouvez le voir dans le même lien, pour accéder à la CopyToDataTable méthode du type T dans l'interface IEnumerable<T> doit être de type DataRow, mais au lieu de cela vous avez utilisé la classe qui représente la table de base de données Vendedor je finis par ne plus avoir accès à ces méthodes d'extension qui inclut la CopyToDataTable.
Il n'est pas valide solution pour la conversion de données de la table
J'ai été mise en œuvre d'un couple de d'autres Objets "shredder" DataTable des solutions telles que celle que vous suggérez dans votre EDIT 2(@David Conde ), mais j'ai découvert qui peut être problématique pour les types complexes (comme indiqué), surtout EntityTypes avec des clés étrangères ou très coûteux, ou les deux. Je pense que dans de nombreux cas, il est tout simplement préférable d'abandonner les types d'Entité de requête et de la DB qui convertit facilement à un DataTable
OriginalL'auteur David Conde
C'est le MSDN solution recommandée: https://msdn.microsoft.com/en-us/library/bb669096(v=vs. 110).aspx
J'ai mis en œuvre avec succès
(*avec des ajouts mineurs à gérer nullable DateTime.)
comme Suit:
}
Le (gros) inconvénient de cette solution est qu'il est ** coûteux** et vous devez le personnaliser dans la gestion des erreurs.
OriginalL'auteur DaniDev
vous pouvez mettre
var query=....
.dataGridViewProcura.DataSource = requête.tolist()
OriginalL'auteur NioDeTark