【问题标题】:How do I refactor the code which contains foreach loop如何重构包含 foreach 循环的代码
【发布时间】:2020-01-14 20:47:51
【问题描述】:

我需要重构下面的代码,以便deleted_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-server asp.net-core .net-core


    【解决方案1】:

    我得到了它我添加了var guids = new List &lt; Guid &gt; (); 列表来存储数据, 添加guids.Add(Guid.Parse(item.guid)); 以填充列表,最后在循环外写入var builds = _DBcontext.Builds.Where(o = &gt;guids.Contains(o.Guid) == false &amp;&amp; o.Foundation == 2 &amp;&amp; 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();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 2020-11-13
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 2015-06-21
      相关资源
      最近更新 更多