如何查询匿名类型集合?
如何查询使用select new
填充/创建的集合?如何查询匿名类型集合?
我有这个BindingSource
:
this.bindingSource.DataSource =
from row in db.Table
select new
{
name = row.Name + row.Num.ToString()
};
我想查询它像我这样做与其他BindingSources:
var query = from row in (IEnumerable<Table>)anotherBindingSource.List
where row.name == "asd"
select row;
由于BindingSource的包含匿名类型我得到这个错误:
Unable to cast object of type 'System.Data.Linq.SortableBindingList
1[<>f__AnonymousType8
15 etc. etc. to type 'System.Collections.Generic.IEnumerable`1[Table]'.
我该怎么办?
那么,不确定你在这里试图做什么,而是一个匿名类型!=一个Table对象。异常表明你正在试图将一个匿名类型的IEnum(一个编译器生成的类名称奇怪)转换为Table类型的IEnum。
您不能在C#中投射类型。例如,您不能这样做:
您不能将任何类型不是表格,或者从表格延伸到表格。
所以你问的是不可能的。你应该退后一步,问一个关于你想要完成什么的更一般的问题。
一些更多的匿名类型......他们才真正有它们所定义的方法的范围之内的意思。看起来你可能会从方法调用返回anon类型枚举,然后尝试排序。这是行不通的,因为一旦匿名类型离开方法范围,它被认为(至少通过intellisense)成为一个对象,并且获得其属性的唯一方法就是使用反射。
如果你的例子不只是一个简化版本,你可以直接跳过完全的匿名类型...
this.bindingSource.DataSource =
from row in db.Table
select row.Name + row.Num.ToString();
这是一个IEnumerable,可正是如此进行查询:
var query = from row in anotherBindingSource
where row.StartsWith("asd")
select row;
但是它看起来并不像你完成了很多在这一切......
你不能屈在它们被定义的范围之外的匿名类型。
这工作:
这不:
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;
}
}
第二个例子不能编译,因为匿名类型被另一个范围内定义。
让这个工作的唯一方法是定义一个类型。
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;} }
}
好吧,忘记bindingSource的东西。你如何查询使用选择新建的集合?例如:var productQuery = from prod in products select new {prod.Color,prod.Price}; 你如何查询“productQuery”?我的意思是使用... ...在哪里。 – dstr 2009-12-09 14:40:02
@Armagan:'productQuery.Where(p => p.Color == someColor && p.Price == somePrice);'或'var anotherQuery =从productQuery中的p其中p.Color == someColor && p.Price == somePrice选择p;'。 – jason 2009-12-09 14:43:09
尝试在内部级别铸造,我的意思是... select(Table)row;在第三行。 – 2009-12-09 14:23:39