我有2个表(Document和DocumentClass),它们包含以下列:
DocumentClass:DocClassID,Name,ParentID
文档:DocID,Name,DocClassID
DocumentClass
表包含父记录和子记录,父记录和子记录之间的关系是ParentID列。 Document
记录通过DocClassID外键与DocumentClass
中的子记录链接。
DocumentClass
中的父记录的ParentID = 0,DocumentClass
中的子记录有ParentID!= 0
我想从DocumentClass
表中检索孩子姓名和孩子的父母姓名。
我设法创建了一个为我做这个功能的功能。我发送一个文档ID列表,找到文档链接到的那些DocumentClass
记录(子记录),然后找到这些子记录的父记录。然后我将我想要的信息放入Child类。
public List<Child> GetDocClassInfo(List<int> docIds)
{
var result = from dc in _context.DocClasses
from d in _context.Documents
where dc.DocClassID == d.DocClassID
where dc.DocClassID != 0
where docIds.Contains(d.DocID)
select new
{
children = from p in _context.DocClasses
where dc.ParentID == p.DocClassID
select new Child
{
ChildId = dc.DocClassID,
ChildDocClassName = dc.DocClassName,
ParentId = p.DocClassID,
ParentDocClassName = p.DocClassName
}
};
return result.ToList();
}
我的问题是我希望从函数返回一个List,但编译器完全不喜欢这个。我收到一条错误说
无法将
System.Collections.Generic.List``<AnonymousType#1>
类型隐式转换为System.Collection.Generic.List<Child>
。
如何编写该LINQ查询以返回List?
致以最诚挚的问候,
OKB
答案 0 :(得分:6)
result
是一个匿名类型列表,每个类型都有一个成员(children
),它是一组可枚举的Child
条记录。你应该可以在这里使用SelectMany:
var list = (from item in result
from child in item.children
select child).ToList();
或(相同):
var list = result.SelectMany(item => item.children).ToList();
答案 1 :(得分:3)
当您说select new { children ...
答案 2 :(得分:2)
var result = (from dc in _context.DocClasses
join d in _context.Documents
on dc.DocClassID equals d.DocClassID
where dc.DocClassID != 0 && docIds.Contains(d.DocID)
let children = from p in _context.DocClasses
where dc.ParentID == p.DocClassID
select new Child {
ChildId = dc.DocClassID,
ChildDocClassName = dc.DocClassName,
ParentId = p.DocClassID,
ParentDocClassName = p.DocClassName
}
select children).SelectMany(c=>c).ToList();