Je ne sais pas exactement ce que vous essayez de faire, mais un type anonyme != un objet Table. L'exception indique que vous essayez de convertir un IEnum d'un type anonyme (une classe générée par le compilateur avec un nom bizarre) en un IEnum de type Table.
En C#, il n'est pas possible d'intégrer des types à tort et à travers. Vous ne pouvez pas, par exemple, faire ceci :
(Table)"Lol I'd like to be a table pls kthx"
Il n'est pas possible d'intégrer un type qui n'est pas déjà un tableau ou qui n'est pas une extension de tableau, dans un tableau .
Ce que vous demandez est donc impossible. Vous devriez probablement prendre du recul et poser une question plus générale sur ce que vous essayez d'accomplir.
Quelques précisions sur les types d'anon... Ils n'ont de sens que dans le cadre de la méthode dans laquelle ils sont définis. Il semble que vous renvoyiez votre énumération de types anonymes à partir d'un appel de méthode et que vous essayiez ensuite de la trier. Cela ne fonctionnera pas, car une fois que le type anonyme quitte la portée de la méthode, il est considéré (au moins par intellisense) comme un objet et la seule façon d'accéder à ses propriétés est d'utiliser la réflexion.
Si votre exemple n'est pas qu'une version simplifiée, vous pourriez tout simplement sauter le type anon...
this.bindingSource.DataSource =
from row in db.Table
select row.Name + row.Num.ToString();
Il s'agit d'un IEnumerable, qui peut être interrogé de la manière suivante :
var query = from row in anotherBindingSource
where row.StartsWith("asd")
select row;
Cependant, il ne semble pas que vous accomplissiez grand-chose avec cela...
Vous ne pouvez pas interroger les types anonymes en dehors du champ d'application dans lequel ils sont définis.
Cela fonctionne :
public void Worthless(Hurr hurr)
{
var query = from x in hurr select new { x.Durr };
var requery = from x in query where x.Durr == "lol" select x;
}
Ce n'est pas le cas :
public class Anonymous
{
public IEnumerable GetMyDurrs(Hurr hurr)
{
return from x in Hurr select new { x.Durr };
}
public IEnumerable WeedMyDurrs(Hurr hurr, string value)
{
// this won't compile
return from x in GetMyDurrs(hurr) where x.Durr == value select x;
}
}
Le deuxième exemple ne sera pas compilé parce que le type anonyme a été défini dans une autre portée.
La seule façon de faire fonctionner ce système est de définir un type.
public class Anonymous
{
public IEnumerable<Anonymous.MyDurr> GetMyDurrs(Hurr hurr)
{
return from x in Hurr select new MyDurr { Durr = x.Durr };
}
public IEnumerable<Anonymous.MyDurr> WeedMyDurrs(Hurr hurr, string value)
{
// this won't compile
return from x in GetMyDurrs(hurr) where x.Durr == value select x;
}
public class MyDurr { public string Durr {get;set;} }
}