2009-12-09 115 views
0

如何查询使用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]'.

我该怎么办?

+0

尝试在内部级别铸造,我的意思是... select(Table)row;在第三行。 – 2009-12-09 14:23:39

回答

4

那么,不确定你在这里试图做什么,而是一个匿名类型!=一个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;} } 
} 
+0

好吧,忘记bindingSource的东西。你如何查询使用选择新建的集合?例如:var productQuery = from prod in products select new {prod.Color,prod.Price}; 你如何查询“productQuery”?我的意思是使用... ...在哪里。 – dstr 2009-12-09 14:40:02

+1

@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