如何查询匿名类型集合?

dst*_*str 0 linq anonymous-types linq-to-sql

如何查询使用select new?填充/创建的集合?

我有这个BindingSource:

this.bindingSource.DataSource = 
    from row in db.Table
    select new 
    {
      name = row.Name + row.Num.ToString()
    };
Run Code Online (Sandbox Code Playgroud)

我想像查询其他BindingSources一样查询它:

var query = from row in (IEnumerable<Table>)anotherBindingSource.List
            where row.name == "asd"
            select row;
Run Code Online (Sandbox Code Playgroud)

由于bindingSource包含匿名类型,我收到此错误:

无法将类型为'System.Data.Linq.SortableBindingList 1[<>f__AnonymousType815 等的对象强制转换为'System.Collections.Generic.IEnumerable`1 [Table]'.

我该怎么办?

小智 5

好吧,不确定你在这里想要做什么,但是一个匿名类型!=一个Table对象.该异常表示您正在尝试将匿名类型的IEnum(具有奇怪名称的编译器生成的类)转换为类型为Table的IEnum.

你不能在C#中使用类型.例如,
(Table)"Lol I'd like to be a table pls kthx"
您不能这样做:您不能转换任何不是Table的类型,也不能从Table扩展到Table.

所以你问的是不可能的.你可能应该退后一步,问一个关于你想要完成什么的更一般的问题.


关于anon类型的更多内容......它们只在定义它们的方法范围内才具有意义.看来您可能正在从方法调用返回您的匿名类型枚举,然后尝试排序.这不起作用,因为一旦匿名类型离开方法范围,它被认为(至少通过intellisense)是一个对象,获得其属性的唯一方法是使用反射.

如果您的示例不仅仅是简化版本,您可以完全跳过anon类型...

this.bindingSource.DataSource = 
    from row in db.Table
    select row.Name + row.Num.ToString();
Run Code Online (Sandbox Code Playgroud)

这是一个IEnumerable,可以这样查询:

var query = from row in anotherBindingSource
            where row.StartsWith("asd")
            select row;
Run Code Online (Sandbox Code Playgroud)

然而,看起来你看起来并没有完成这个......


您无法在定义它们的范围之外查询匿名类型.

这有效:

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;
}
Run Code Online (Sandbox Code Playgroud)

这不是:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

第二个示例将无法编译,因为匿名类型是在另一个范围内定义的.

让它工作的唯一方法是定义一个类型.

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;} }
}
Run Code Online (Sandbox Code Playgroud)