1

我正在使用 EF 和 Linq 从数据库中返回值。我有一个Folder结构,一个文件夹可以包含一个列表FolderDevice. 我想要的是能够构建位于Device文件夹内(或下)的所有 s 的列表,包括属于该文件夹的任何文件夹(想象一下我想查看顶级目录中的所有文件,其中还包括子目录) .

这里真正的问题是可能有很多设备,所以我想要分页,所以理想情况下这一切都可以使用 LINQ 完成,这样我就可以在返回结果集之前对查询进行排序和分页。

这是我的设置的基本版本(为简单起见,删除了键、注释和其他内容)

public class Folder
{
    public virtual ICollection<Folder> Children { get; set; }
    public virtual ICollection<Device> Devices { get; set; }
}

// This is the function I currently have that only returns 1 folder
// needs to somehow be expanded to return devices for all folders beneath it too
function GetFolderDevices(int folderId, PaginationOptions options)
{
    // Get all folders and devices
    using (var dbObj = this.context.CreateDBContext())
    {
        EMDB.Models.Folder folder = dbObj
            .AddressBook
            .Include(a => a.Devices.Select(d => d.Settings))
            .FirstOrDefault(f => f.FolderId == folderId);

        // apply pagination here (already taken care of)
    }
}
4

1 回答 1

2

我相信你可以使用迭代器。像这样的东西可能会起作用:

    static IEnumerable<Folder> Descendants(Folder root)
    {
        var nodes = new Stack<Folder>(new[] { root });
        while (nodes.Any())
        {
            Folder node = nodes.Pop();
            yield return node;
            foreach (var n in node.Children) nodes.Push(n);
        }
    }

对于每个产生的节点,它只会遍历之前的节点子节点。

这基本上是从这里偷来的(仅稍作修改)

我相信你可以这样做:

    // This is the function I currently have that only returns 1 folder
    // needs to somehow be expanded to return devices for all folders beneath it too
    function GetFolderDevices(int folderId, PaginationOptions options)
    {
            // Get all folders and devices
            using (var dbObj = this.context.CreateDBContext())
            {
                    EMDB.Models.Folder folder = dbObj
                            .AddressBook
                            .Include(a => a.Devices.Select(d => d.Settings))
                            .FirstOrDefault(f => f.FolderId == folderId);

                    var result = from fold in Descendants(folder)
                                 select fold;
                    // apply pagination here (already taken care of)
            }
    }
于 2013-08-20T08:35:52.997 回答