如何将匿名类型IQueryable结果转为自定义GamesWithPlayers列表?
解决匿名类型List转自定义类List的问题
嘿,这个场景我经常碰到,强制转换行不通是因为匿名类型和你自定义的GamesWithPlayers是完全独立的类型,CLR根本不会把它们当成一回事,所以得用LINQ的Select方法来做显式的映射转换,非常简单。
方法一:从已有的匿名类型List转换
如果你已经把IQueryable转成了anonList,直接对这个List用Select遍历每个元素,把匿名对象的属性赋值给GamesWithPlayers的实例,最后调用ToList()就能得到目标列表:
List<GamesWithPlayers> gamesWithPlayers = anonList .Select(anonItem => new GamesWithPlayers { game = anonItem.g, gameHasPlayer = anonItem.ghp }) .ToList();
方法二:直接从IQueryable转换(更高效)
其实你完全可以跳过先转成匿名类型List的步骤,直接在原始的IQueryable<匿名类型>上做转换,这样LINQ to Entities会尽量把查询逻辑推送到数据库端执行,性能会更好:
// 这里的x是你的原始IQueryable<匿名类型> List<GamesWithPlayers> gamesWithPlayers = x .Select(anonItem => new GamesWithPlayers { game = anonItem.g, gameHasPlayer = anonItem.ghp }) .ToList();
为什么强制转换会失败?
补充一句:匿名类型是编译器在编译时自动生成的密封类,它和你手动定义的GamesWithPlayers没有任何继承或实现关系,也不是同一类型,所以直接用(List<GamesWithPlayers>)强制转换必然会抛出InvalidCastException,必须通过显式的属性映射来完成类型转换。
内容的提问来源于stack exchange,提问作者jamheadart
相关产品推荐
相关产品推荐

