首页 > 解决方案 > 如何重构包含 foreach 循环的代码

问题描述

我需要重构下面的代码,以便 delete_at 逻辑将在foreach (var app in data)循环之外。我尝试创建列表guids,然后向其中添加 guid,但它不起作用,因为model.resources它在循环内并且它仍在删除所有应用程序。

我需要deleted_at外部逻辑,因为我正在尝试删除数据库中但不在我从 API 接收的新数据中的所有应用程序。

如果您对我的代码有更好的方法,我很乐意看到,谢谢。

public async Task GetBuilds()
{
    var data = new List<GetBuildTempClass>();
    var guids = new List<GetBuildTempClass>();

    using (var scope = _scopeFactory.CreateScope())
    {
        var _DBcontext = scope.ServiceProvider.GetRequiredService<PCFStatusContexts>();

        foreach (var app in data)
        {
            var request = new HttpRequestMessage(HttpMethod.Get,
                "apps/" + app.AppGuid + "/builds?per_page=200&order_by=updated_at");
            var response = await _client_SB.SendAsync(request);
            var json = await response.Content.ReadAsStringAsync();
            BuildsClass.BuildsRootObject model =
                JsonConvert.DeserializeObject<BuildsClass.BuildsRootObject>(json);

            foreach (var item in model.resources)
            {
                var x = _DBcontext.Builds.FirstOrDefault(o =>
                    o.Guid == Guid.Parse(item.guid));

                if (x == null)
                {
                    _DBcontext.Builds.Add(new Builds
                    {
                        Guid = Guid.Parse(item.guid),
                        State = item.state,
                        CreatedAt = item.created_at,
                        UpdatedAt = item.updated_at,
                        Error = item.error,
                        CreatedByGuid = Guid.Parse(item.created_by.guid),
                        CreatedByName = item.created_by.name,
                        CreatedByEmail = item.created_by.email,
                        AppGuid = app.AppGuid,
                        AppName = app.AppName,
                        Foundation = 2,
                        Timestamp = DateTime.Now
                    });
                }
                else if (x.UpdatedAt != item.updated_at)
                {
                    x.State = item.state;
                    x.UpdatedAt = item.updated_at;
                    x.Timestamp = DateTime.Now;
                }

                var sqlresult = new GetBuildTempClass
                {
                    AppGuid = Guid.Parse(item.guid)
                };

                guids.Add(sqlresult);
            }

            //var guids = model.resources.Select(r => Guid.Parse(r.guid));
            var builds = _DBcontext.Builds.Where(o =>
                guids.Contains(o.Guid) == false &&
                o.Foundation == 2 && o.DeletedAt == null);

            foreach (var build_item in builds)
            {
                build_item.DeletedAt = DateTime.Now;
            }
        }

        await _DBcontext.SaveChangesAsync();
    }
}

标签: c#sql-serverasp.net-core.net-core

解决方案


我让它工作了我添加var guids = new List < Guid > ();列表来存储数据,添加guids.Add(Guid.Parse(item.guid));来填充列表,最后 var builds = _DBcontext.Builds.Where(o = >guids.Contains(o.Guid) == false && o.Foundation == 2 && o.DeletedAt == null);在循环之外写。

如果有人有更好的建议,请添加新答案。

public async Task GetBuilds() {
        var data = new List < GetBuildTempClass > ();
        var guids = new List < Guid > ();

        using(var scope = _scopeFactory.CreateScope()) {
            var _DBcontext = scope.ServiceProvider.GetRequiredService < PCFStatusContexts > ();

            foreach(var app in data) {
                var request = new HttpRequestMessage(HttpMethod.Get, "apps/" + app.AppGuid + "/builds?per_page=200&order_by=updated_at");
                var response = await _client_SB.SendAsync(request);
                var json = await response.Content.ReadAsStringAsync();
                BuildsClass.BuildsRootObject model = JsonConvert.DeserializeObject < BuildsClass.BuildsRootObject > (json);

                foreach(var item in model.resources) {
                    var x = _DBcontext.Builds.FirstOrDefault(o = >o.Guid == Guid.Parse(item.guid));

                    if (x == null) {
                        _DBcontext.Builds.Add(new Builds {
                            Guid = Guid.Parse(item.guid),
                            State = item.state,
                            CreatedAt = item.created_at,
                            UpdatedAt = item.updated_at,
                            Error = item.error,
                            CreatedByGuid = Guid.Parse(item.created_by.guid),
                            CreatedByName = item.created_by.name,
                            CreatedByEmail = item.created_by.email,
                            AppGuid = app.AppGuid,
                            AppName = app.AppName,
                            Foundation = 2,
                            Timestamp = DateTime.Now
                        });
                    }
                    else if (x.UpdatedAt != item.updated_at) {
                        x.State = item.state;
                        x.UpdatedAt = item.updated_at;
                        x.Timestamp = DateTime.Now;
                    }

                    guids.Add(Guid.Parse(item.guid));
                }
            }

            var builds = _DBcontext.Builds.Where(o = >guids.Contains(o.Guid) == false && o.Foundation == 2 && o.DeletedAt == null);

            foreach(var build_item in builds) {
                build_item.DeletedAt = DateTime.Now;
            }

            await _DBcontext.SaveChangesAsync();
        }
    }

推荐阅读