繁体   English   中英

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

[英]Unable to cast anonymous list into known list in LINQ

我有一个LINQ查询,它从一张表中返回结果。 我需要将其转换为该表模型的列表。 groupManager的匿名类型为List <a> 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();

该代码似乎不起作用。我遇到的错误是{“无法将类型'<> 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方法确实比铸造的所有对象列表中为另一种类型提供不同的目的。 编译器抛出此异常并不奇怪,因为Cast所做的是获取IEnumerable (非通用版本)并返回相同的集合,但具有通用IEnumerable<T> 这是LINQ中使用非通用IEnumerable作为参数的两种方法之一(第二种是OfType ),因此您可以具有给定类型的集合,将其转换为IEnumerable<T>并使用需要IEnumerable<T>其他LINQ方法。 IEnumerable<T>作为参数。

只看源代码

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;

因此您的收藏集应该能够被Cast转换为给定的T类型,以便能够Cast正常工作。 它不会将您的匿名类型转换为具体类型。

如果选择实际的对象,则返回的是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()会将其转换为列表。 无需创建动态对象然后进行投射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM