【解決方法】カウント関数を使わずにテーブルの行数を取得するには?


カウント関数を使わずにテーブルの行数を取得するには?
私はカウントを使用していますが、データをロードするのに時間がかかりすぎるので、カウントなしでデータをロードする別の方法は何ですか

私が試したこと:

public IActionResult Index()
        
        {
            List<ServiceUserVM> seruser = new List<ServiceUserVM>();
            var alluser = this.cc.users.ToList();
            var allservices = this.cc.Services.ToList();

            for(int i=0;i<alluser.Count();i++)
            {
             
                for (int j = 0; j < allservices.Count(); j++)
                {
                    ServiceUserVM serviceUser = new ServiceUserVM();
                    if (this.cc.serviceAuthorizations.Any(p => p.UserID == alluser[i].UserID && p.ServiceID == allservices[j].ServiceID))
                    {
                       
                        serviceUser.UserID = alluser[i].UserID;
                        serviceUser.UserName = alluser[i].UserName;
                        serviceUser.ServiceName = allservices[j].ServiceName;
                        serviceUser.ServiceID = allservices[j].ServiceID;
                        serviceUser.status = "Allready Exist";
                        seruser.Add(serviceUser);
                    }
                    else
                    {


                        serviceUser.UserID = alluser[i].UserID;
                        serviceUser.UserName = alluser[i].UserName;
                        serviceUser.ServiceName = allservices[j].ServiceName;
                        serviceUser.ServiceID = allservices[j].ServiceID;
                        serviceUser.status = "Services Not Exist";
                        seruser.Add(serviceUser);
                    }
                }
            }

            return View(seruser);
        }

解決策 2

速度を落としているのは .Count の呼び出しではありません。 users テーブルと Services テーブル全体をロードしているように見える 2 行があります。次に、users テーブルの次のユーザーを見るたびに、両方のテーブル (Services テーブル) を反復処理します。 ループ内にネストされたループがあり、それがパフォーマンスを低下させています。

次に、このステートメントを (Num user records * Num Services records) 回実行しています。

C#
this.cc.serviceAuthorizations.Any(p => p.UserID == alluser[i].UserID && p.ServiceID == allservices[j].ServiceID

PER ITERATION THROUGH THE LOOP.

このコードで何をしようとしているのかはわかりません。今は疲れすぎて考えることができませんが、これはデータベースで解決する方が適切であり、一連の行を反復処理するのではないようです。非効率的なコードでそれを行う。

解決策 3

あなたを遅くしているのはカウントを取得しているとは思いません。
forループだと思います。

for ループをコメントアウトして、やり直してください。

C#
public IActionResult Index()
        
        {
            List<ServiceUserVM> seruser = new List<ServiceUserVM>();
            var alluser = this.cc.users.ToList();
            var allservices = this.cc.Services.ToList();

            Console.WriteLine(allservices.Count());
            Console.WriteLine(alluser.Count());
            
            return View(seruser);
        }

それがより速い場合、それは単に for ループが多数のレコードをループしているという事実です。

コメント

タイトルとURLをコピーしました