asp.net mvc 5 reader.read () получает только первые и последние строки - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть список select2 с сотрудниками, который администратор добавит в проект.

Я выбираю несколько сотрудников и отправляю json с идентификаторами сотрудников на контроллер, где пытаюсь найти сотрудника по сотруднику, из базы данных emp компании по хранимой процедуре.[Сотрудник] в web emp db.

Я сталкиваюсь с такой проблемой, что читатель читает только первые и последние строки и пропускает всех сотрудников в середине

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult EmpAdd()
    {
        var project_id = Convert.ToInt32(Request["project"]);
        var company = Request["company"];
        var emp = Request["emp"];
        var ids = emp.Split(',');
        var project = db.apsk_project.Where(x => x.id == project_id).FirstOrDefault();

        cmd.CommandText = "Employee";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection = sqlConnection1;

        foreach(var i in ids) {
            var it = Convert.ToInt32(i);
            var kortele = db.apsk_workers.Where(x => x.id == it).FirstOrDefault();
            if(kortele == null) {
                sqlConnection1.Open();

                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("company", company);
                cmd.Parameters.AddWithValue("nr", it);
                reader = cmd.ExecuteReader();

                if(reader.HasRows) {
                    while(reader.Read()) {

                        apsk_workers apsk = new apsk_workers();

                        var v = reader.GetString(1);
                        var p = reader.GetString(2);
                        var d = reader.GetDateTime(3);

                        apsk.kof_id = 0;
                        apsk.algos_tipas = "";
                        apsk.vardas = v;
                        apsk.pavarde = p;
                        apsk.ar_dirba = d;
                        apsk.company = company;
                        apsk.manager = User.Identity.Name;
                        apsk.id = it;

                        db.apsk_workers.Add(apsk);
                        db.SaveChanges();
                    }
                }
                sqlConnection1.Close();

                apsk_assigned _Assigned = new apsk_assigned();

                _Assigned.project_id = project_id;
                _Assigned.project = project.project;
                _Assigned.worker_id = it;

                db.apsk_assigned.Add(_Assigned);
                db.SaveChanges();
            } else {
                var ar_projekte = db.apsk_assigned.Where(x => x.project_id == project_id && x.worker_id == it).FirstOrDefault();
                if(ar_projekte == null) {
                    apsk_assigned _Assigned = new apsk_assigned();

                    _Assigned.project_id = project_id;
                    _Assigned.project = project.project;
                    _Assigned.worker_id = it;

                    db.apsk_assigned.Add(_Assigned);
                    db.SaveChanges();
                }
            }
        }

Назначение человека для проекта работает нормально.

1 Ответ

0 голосов
/ 11 декабря 2018

Я бы сделал несколько изменений:

  • Вы смешиваете EF с ado.net. Поэтому, пожалуйста, удалите все открытия и закрытия соединений.Также строки с Parameters и т. Д.
  • Поскольку id - это строка, вы можете преобразовать ее в список целых чисел: https://stackoverflow.com/a/9301290/169714
  • С помощью Linq вы можете назначать сотрудников, которые уже известны.к проекту
  • С помощью Linq вы можете добавлять и добавлять неизвестных сотрудников и сохранений после их добавления.

Сообщите нам, если вам нужна помощь с конкретными запросами Linq.Например: вместо db.apsk_project.Where(x => x.id == project_id).FirstOrDefault(); вы можете использовать db.apsk_project.FirstOrDefault(x => x.id == project_id);

Так что не делайте foreach, а затем сначала или по умолчанию изменяйте для каждой строки, но думайте в коллекциях, чтобы вы могли устранить цикл и повысить производительность,Надеюсь это поможет.Если нет, пожалуйста, прокомментируйте, чтобы я мог попытаться объяснить больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...