1

データベースから値を返すために EF と Linq を使用しています。私はFolder構造を持っており、フォルダには のFolderリスト または のリストを含めることができますDevice。私が望むのは、Deviceフォルダーに属するフォルダーを含むフォルダー内 (またはフォルダーの下) にあるすべての のリストを作成できるようにすることです (子ディレクトリも含む最上位ディレクトリ内のすべてのファイルを表示したいとします)。 .

ここでの本当のキッカーは、多くのデバイスが存在する可能性があることです。そのため、ページネーションが必要です。理想的には、結果セットが返される前にクエリを並べ替えてページネーションできるように、これはすべて 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 に答える