0

Entityフレームワークを使用してMVC3でプロジェクトを行っていました。foreach を使用した LINQ クエリがあります。すべて順調。しかし、データ サイズが大きくなると、パフォーマンスの問題に直面していました。私はLINQの経験があまりありません。そのため、問題を解決できませんでした。Pls は私のコードを見て、私により良い提案を提供します。

コード

        List<int> RouteIds = db.Cap.Where(asd => asd.Type == 3).Select(asd => asd.UserId).ToList();

        var UsersWithRoutingId = (from route in db.RoutingListMembers
                                  where RouteIds.Contains(route.RoutingListId.Value) && route.User.UserDeptId == Id
                                  select
                                      new RoutingWithUser
                                      {
                                          UserId = route.UserId,
                                          RoutingId = route.RoutingListId
                                      });

        var ListRouteValue = (from cap in db.CareAllocationPercents
                              where cap.Type == 3
                              select new UserWithDeptId
                              {
                                  Year = (from amt in db.CareAllocations where amt.CareItemId == cap.CareItemId select amt.Year).FirstOrDefault(),
                                  UserId = cap.UserId,
                                  UserDeptId = (from userdept in db.Users where userdept.Id == cap.UserId select userdept.UserDeptId).FirstOrDefault(),

                              });

        List<UserWithDeptId> NewRouteList = new List<UserWithDeptId>();
        ListRouteValue = ListRouteValue.Where(asd => asd.Year == Year);

        foreach (var listdept in ListRouteValue)
        {
            foreach (var users in UsersWithRoutingId)
            {
                if (users.RoutingId == listdept.UserId)
                {
                    UserWithDeptId UserwithRouteObj = new UserWithDeptId();
                    UserwithRouteObj.UserId = users.UserId;
                    UserwithRouteObj.Year = listdept.Year;
                    UserwithRouteObj.UserDeptId = db.Users.Where(asd => asd.Id == users.UserId).Select(asd => asd.UserDeptId).FirstOrDefault();

                    NewRouteList.Add(UserwithRouteObj);
                }
            }
        }
        NewRouteList = NewRouteList.Where(asd => asd.UserDeptId == Id).ToList();

ありがとう、

4

2 に答える 2

0

最初のステートメントで join を使用する必要があります。これを行う方法の例は、たとえば次のとおりです: LINQ to SQL での結合

于 2013-04-26T09:20:39.097 に答える
0

私はあなたのためにいくつかのアイデアを持っています: 最初: 必要なものだけを取得するために、linq クエリに近い場所を完了するように注意してください。コレクションに Linq を使用すると、1 つの foreach ループを削除できます。私は最終的なものを知りませんが、私はあなたのために何かを書くことを試みました:

var UsersWithRoutingId = (from route in db.RoutingListMembers
                                      where RouteIds.Contains(route.RoutingListId.Value) && route.User.UserDeptId == Id
                                      select
                                          new RoutingWithUser
                                          {
                                              UserId = route.UserId,
                                              RoutingId = route.RoutingListId
                                          });

            var ListRouteValue = (from cap in db.CareAllocationPercents
                                  where cap.Type == 3
                                  select new UserWithDeptId
                                  {
                                      Year = (from amt in db.CareAllocations 
                                              where amt.CareItemId == cap.CareItemId && amt.Year == Year
                                              select amt.Year).FirstOrDefault(),
                                      UserId = cap.UserId,
                                      UserDeptId = (from userdept in db.Users 
                                                    where userdept.Id == cap.UserId && userdept.UserDeptId == Id  
                                                    select userdept.UserDeptId).FirstOrDefault(),

                                  });
List<UserWithDeptId> NewRouteList = new List<UserWithDeptId>();

            foreach (var listdept in ListRouteValue)
            {

                var user = UsersWithRoutingId.Where(uwri => uwri.RoutingId == listdept.UserId).FirstOrDefault();
                if (user != null)
                {
                    NewRouteList.Add(new UserWithDeptId { UserId=user.UserId, Year=listdept.Year, UserDeptId=listdept.UserDeptId  });
                }
            }

            return NewRouteList

よろしいですか?(私は db.user テーブルをポーリングしません。listdept のものが適切であると仮定して、NewRouteList の UserDeptId を取得します)

2番目:外部キーを持つテーブルがある場合は、エンティティデータの読み込みに注意してください。テーブルの子を同時に読み込む必要がない場合は、遅延読み込みを削除するように注意してください。他を指している外部キーを持つ複数のテーブルの利益を想像してみてください。編集:これを説明するリンクがあります: http://msdn.microsoft.com/en-us/library/vstudio/dd456846%28v=vs.100%29.aspx

于 2013-04-26T09:46:21.207 に答える