我有一个LINQ查询,它返回一个表的结果。我需要将其转换为该表模型的List。匿名类型的groupManager是List< a> where
a是{Group g5}
var groups = new List<Group>();
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<Group>().ToList();
此代码似乎不起作用。我得到的错误是{&#34;无法投射类型&#39;&lt;&gt; f__AnonymousType11`1 [Group]&#39;键入&#39; Group&#39;。&#34;}我错过了什么?
答案 0 :(得分:1)
select new Group(g5)).ToList();
或者
select g5).ToList();
在不了解组对象或示例中的其他类型的情况下,很难说更多。
答案 1 :(得分:0)
您可以在没有匿名类型或演员表的情况下执行此操作。
var groups = (from a in db.AUsers
// Your query...
select new Group
{
// Properties of Group
Name = g5.Name,
AnotherProperty = g5.AnotherProperty
}).ToList();
答案 2 :(得分:0)
如果答案绝对正确,但我想在Cast
方法上指出一个微妙的事情(并回答“我错过了什么”部分)可能会很好。
Cast
方法实际上用于将列表中的所有对象转换为另一种类型。毫不奇怪,编译器抛出此异常,因为Cast
执行IEnumerable
(非泛型版本)并返回相同的集合,但使用泛型IEnumerable<T>
。这是LINQ中将非泛型IEnumerable
作为参数(第二个是OfType
)的两种方法之一,因此您可以拥有给定类型的集合,将其强制转换为IEnumerable<T>
并使用其他需要IEnumerable<T>
作为参数的LINQ方法。
只需查看源代码
即可public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source) {
IEnumerable<TResult> typedSource = source as IEnumerable<TResult>;
if (typedSource != null) return typedSource;
if (source == null) throw Error.ArgumentNull("source");
return CastIterator<TResult>(source);
}
并在CastIterator
foreach (object obj in source) yield return (TResult)obj;
因此,您的收藏品应该能够投放到指定类型T
,以便Cast
能够正常工作。它不会将您的匿名类型转换为具体类型。
答案 3 :(得分:0)
如果您选择实际的对象,那么您将获得的是IEnumerable of Group:
var groups = new List<Group>();
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()会将其转换为列表。无需创建动态对象然后进行强制转换。