无法将匿名列表转换为LINQ中的已知列表
我有一个LINQ查询,它返回一个表的结果。 我需要将其转换为该表模型的List。 groupManager的匿名类型是List a> where
a是{Group g5}
var groups = new List(); var groupManager = (from a in db.AUsers join b in db.BUsers on a.Id equals b.UserID into group1 from g1 in group1.DefaultIfEmpty() join c in db.UserRoles on g1.ID equals c.UserID into group2 from g2 in group2.DefaultIfEmpty() join d in db.Roles on g2.RoleID equals d.ID into group3 from g3 in group3.DefaultIfEmpty() join e in db.RoleGroups on g3.ID equals e.RoleID into group4 from g4 in group4.DefaultIfEmpty() join f in db.Groups on g4.GroupID equals f.ID into group5 from g5 in group5.DefaultIfEmpty() where a.Id == user.ID && g5.Name != "" select new{ Group = g5}).ToList(); groups = groupManager.Cast().ToList();
这段代码似乎不起作用。我得到的错误是{“无法将类型’ f__AnonymousType11`1 [Group]’的对象转换为’Group’类型。”}我错过了什么?
嗯……你试试这个吗?
select new Group(g5)).ToList();
或这个
select g5).ToList();
如果不了解组对象或示例中的其他类型,就很难说更多。
您可以在没有匿名类型或强制转换的情况下执行此操作。
var groups = (from a in db.AUsers // Your query... select new Group { // Properties of Group Name = g5.Name, AnotherProperty = g5.AnotherProperty }).ToList();
提供的答案是绝对正确的,但我想对于Cast
方法指出一个微妙的事情(并回答“我错过了什么”部分)可能会很好。
Cast
方法确实用于将列表中的所有对象转换为另一种类型。 毫不奇怪,编译器抛出此exception,因为Cast
所做的是采用IEnumerable
(非generics版本)并返回相同的集合,但使用通用的IEnumerable
。 这是LINQ中以非通用IEnumerable
作为参数(第二个是OfType
)的两种方法之一,因此您可以拥有给定类型的集合,将其强制转换为IEnumerable
并使用其他需要IEnumerable
LINQ方法IEnumerable
作为一个论点。
只需看看源代码
public static IEnumerable Cast (this IEnumerable source) { IEnumerable typedSource = source as IEnumerable ; if (typedSource != null) return typedSource; if (source == null) throw Error.ArgumentNull("source"); return CastIterator (source); }
并在CastIterator
foreach (object obj in source) yield return (TResult)obj;
所以你的集合应该能够被铸造到给定的类型T
,以便Cast
到工作。 它不会将您的匿名类型转换为具体类型。
如果你选择了实际的对象那么你得到的是IEnumerable of Group:
var groups = new List(); var groupManager = (from a in db.AUsers join b in db.BUsers on a.Id equals b.UserID into group1 from g1 in group1.DefaultIfEmpty() join c in db.UserRoles on g1.ID equals c.UserID into group2 from g2 in group2.DefaultIfEmpty() join d in db.Roles on g2.RoleID equals d.ID into group3 from g3 in group3.DefaultIfEmpty() join e in db.RoleGroups on g3.ID equals e.RoleID into group4 from g4 in group4.DefaultIfEmpty() join f in db.Groups on g4.GroupID equals f.ID into group5 from g5 in group5.DefaultIfEmpty() where a.Id == user.ID && g5.Name != "" select g5).ToList() groups = groupManager;
然后.ToList()会将其转换为列表。 无需创建动态对象然后进行强制转换。
上述就是C#学习教程:无法将匿名列表转换为LINQ中的已知列表分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1255957.html