【发布时间】:2015-03-24 23:52:16
【问题描述】:
我拥有此查询所需的大部分内容,但似乎无法获得最后一点。基本上,我需要将Where 子句应用于Book 部分。例如,我需要知道哪个Parent 有一个Child 读过书1234。所以在这种情况下,我的 LINQ 查询将返回一个 Parent 类,其中包含 John 和 Sallys 信息(但显然有更多的记录不会返回)。当我添加Books = grp1.Select(q=>q.Books) 时,我设置的所有内容都返回错误消息Error 199 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<System.Collections.Generic.List<int>>' to 'System.Collections.Generic.List<int>'. An explicit conversion exists (are you missing a cast?)。有什么想法吗?
类
public class Parent
{
public Parent() { }
public int ParentID { get { return _parentID; } set { _parentID = value; } }
public List<Child> Children { get { return _child; } set { _child = value; } }
}
public class Child
{
public Child() { }
public int ChildID { get { return _childID; } set { _childID = value; } }
public List<int> BookID { get { return _books; } set { _books = value; } }
}
表格
Parent ID | Parent | Child ID | Child | Books
1 | John | 4 | Suzy | 1234
1 | John | 4 | Suzy | 4567
1 | John | 5 | James | 6789
2 | Sally | 4 | Suzy | 1234
2 | Sally | 4 | Suzy | 4567
2 | Sally | 5 | James | 6789
查询制作父母名单##
List<Parent> Parents = dt.AsEnumerable().GroupBy(x => x.Field<int>("parent_id"))
.Select(x => new Parent
{
ParentID = x.Key,
Children = x.GroupBy(y => y.Field<int>("children")).Select(z => new Child
{
ChildID = z.Key,
Books = z.Select(b => b.Field<int>("books")).ToList()
}).ToList()
}).ToList();
期望的结果
List<Parent>
父类索引 0: 家长编号:1 儿童指数 0: 儿童编号:4 BookID 索引 0: 1234,图书索引 1: 4567 儿童索引 1: 儿童编号:5 BookID 索引 0: 6789
...等等。
【问题讨论】:
-
x, y, z不是特别有用的名称。如果您使用 lambda 变量做任何远程复杂的事情,那么值得给它一个更好的名称。 -
@ObliviousSage 适当地指出,这只是为了让它工作。我很难理解这个查询。在我 100% 理解每个变量所代表的含义之前,我觉得命名变量是没有意义的……如果这有意义的话。
-
签出了“SelectMany”?
-
@Sasse 我不确定字符数组将如何帮助我?至少如果我正确理解
SelectMany。 -
那你就倒退了。从您理解的简单部分构建查询。每当一个 lambda 变量被多次引用时,这意味着是时候给它一个更具描述性的名称,以便在添加更多片段时记住它是什么。