0

ユーザーがカテゴリ別にレコードをフィルタリングできるアプリケーションに取り組んでいます。

レコードには 1 つのカテゴリが必要ですが、複数のカテゴリを持つことができます。(1-*)

私が持っている質問は、この検索を改善するにはどうすればよいですか? 現在、次の理由により、約 O(n^3) で実行されます。

トランザクションには多くのレコード (1-many) が含まれる場合がある レコードには多数のカテゴリ (1-many) がある場合がある 検索用に選択されたカテゴリを反復処理する

私がやっていることの基本的な概要は次のとおりです。

retrieve all announcements

if(startDate and endDate have values)
    model = model.Where(x => x.WADate >= start.Value && x.WADate <= end.Value).ToList();

if(queryString is not null)
    model = model.Where(
                        x => x.WANum.Contains(query) ||
                        x.Tooltip.ToLower(CultureInfo.InvariantCulture).Contains(query)
                        || x.Topic.ToLower(CultureInfo.InvariantCulture).Contains(query)
                    ).ToList();

if (selectedCategories.Count > 0)
        {
            bool HasMatch;
            foreach (var ancmt in announcements)
            {
                HasMatch = false;
                foreach (var cat in selectedCategories)
                {
                    foreach (var xref in ancmt.waXref)
                    {
                        if (cat.ID == xref.WACategoryID)
                        {
                            HasMatch = true;
                        }
                    }
                }
                if(HasMatch)
                {
                    model.Add(new EditViewModel
                    {
                        WATypeID = ancmt.WATypeID,
                        WANum = ancmt.WANum,
                        WATypeName = ancmt.waType.WATypeDescription,
                        Link = ancmt.Link,
                        Tooltip = ancmt.Tooltip,
                        Topic = ancmt.Topic,
                        WADate = ancmt.WADate,
                        WAID = ancmt.WAID,
                    });

                    ancmt.waXref.ToList().ForEach(
                        x => model.Last().Categories.Add(
                            new CategoryViewModel { ID = x.WACategoryID, Name = x.waCategory.WACategory, IsSelected = false }));
                }
            }
        }
        // If no catgories were selected, keep all announcements for next stage of search
        else
        {
            foreach (var ancmt in announcements)
            {
                model.Add(new EditViewModel
                {
                    WATypeID = ancmt.WATypeID,
                    WANum = ancmt.WANum,
                    WATypeName = ancmt.waType.WATypeDescription,
                    Link = ancmt.Link,
                    Tooltip = ancmt.Tooltip,
                    Topic = ancmt.Topic,
                    WADate = ancmt.WADate,
                    WAID = ancmt.WAID,
                });

                ancmt.waXref.ToList().ForEach(
                    x => model.Last().Categories.Add(
                        new CategoryViewModel { ID = x.WACategoryID, Name = x.waCategory.WACategory, IsSelected = false }));
            }
        }

私はクエリではなくメソッド構文を使用しており、メソッド構文にとどまることを好みます。

4

1 に答える 1

1

実際のパフォーマンスを向上させるには、特定のストアド プロシージャを作成して、クライアント PC ではなくデータベースで真の重い処理を処理するのが最善です。

于 2016-06-21T17:38:51.043 に答える