无法将匿名列表转换为LINQ中的已知列表

时间:2016-10-21 17:07:31

标签: c# entity-framework linq

我有一个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;}我错过了什么?

4 个答案:

答案 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()会将其转换为列表。无需创建动态对象然后进行强制转换。