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)