LINQ以及如何返回特定类型的列表

OKB*_*OKB 5 c# linq casting list subquery

我有2个表(Document和DocumentClass),它们包含以下列:

DocumentClass:DocClassID,Name,ParentID

文档:DocID,Name,DocClassID

DocumentClass表包含父记录和子记录,父记录和子记录之间的关系是ParentID列.一个Document记录与在子记录链接DocumentClass由DocClassID外键.

父记录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();
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是我希望从函数返回一个List,但编译器完全不喜欢这个.我说错了

无法隐式转换System.Collections.Generic.List``<AnonymousType#1>System.Collection.Generic.List<Child>.

如何编写LINQ查询以返回List?

最好的祝福,

OKB

Mar*_*ell 6

result是一个匿名类型列表,每个类型都有一个member(children),它是一组可枚举的Child记录.你应该可以在这里使用SelectMany:

var list = (from item in result
            from child in item.children
            select child).ToList();
Run Code Online (Sandbox Code Playgroud)

或(相同):

var list = result.SelectMany(item => item.children).ToList();
Run Code Online (Sandbox Code Playgroud)


Muh*_*han 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();
Run Code Online (Sandbox Code Playgroud)