В частности, увеличить значение идентификатора в зависимости от внешнего ключа - PullRequest
0 голосов
/ 31 мая 2019

У меня есть две таблицы базы данных; один с именем Mold, другой с именем MeasResult. Таблица Mold имеет MID в качестве первичного ключа, а таблица MeasResult имеет внешний ключ с именем MoldID, который ссылается на MID. Я записываю измерение в таблицу MeasResult, используя этот внешний ключ. В таблице MeasResult также есть столбец MeasID, который отслеживает количество вставок измерений. Для каждого измерения я записываю 50 строк данных. Что мне нужно, так это то, что мне нужно увеличивать это значение MeasID на 1 каждый раз, когда регистрируется новое измерение с учетом MoldID (внешний ключ в таблице) .

Мой текущий код не обращает внимания на внешний ключ, он просто увеличивает значение MeasResult на единицу для каждого журнала измерений.

using (LinqDataClassesDataContext dataContext = new 
LinqDataClassesDataContext())
            {
                var measid = dataContext.MeasResults.Select(a => 
a.MeasId).Where(p => p != null).Max() + 1;

                string id = ""; string plane = ""; int pos = 0; int dist = 0; double apert = 0;

                id = comboBMouldID.SelectedValue.ToString();
                plane = comboBSurface.SelectedItem.ToString();
                pos = Convert.ToInt32(txtTravelPos.Text);

                for (int i = 0; i < daGridMeas.Rows.Count - 1; i++)
                {
                    dist = Convert.ToInt32(daGridMeas.Rows[i].Cells[0].Value.ToString());
                    apert = Convert.ToDouble(daGridMeas.Rows[i].Cells[1].Value.ToString());

                    var st = new MeasResult();
                    {
                        st.MoldID = id;
                        st.Plane = plane;
                        st.Postn = pos;
                        st.Distnc = dist;
                        st.Apert = apert;
                        st.MeasId = measid;
                        st.Date = DateTime.Now;
                    };

                    dataContext.MeasResults.InsertOnSubmit(st);
                    dataContext.SubmitChanges();
                }

Как я могу изменить код, чтобы он увеличивал MeasID на 1 для каждого измерения, выполненного для конкретного MoldID?

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Тогда это должно быть довольно просто, основываясь на вашем ответе.

Рассчитать существующее количество записей с этим MoldID:

var NumberOfPreviousMeasurements = dataContext.MeasResults.Where(m => m.MoldId == comboMouldID.SelectedValue.ToString()).Count();

И затем назначить это значение как MeasureId новогозапись.Разве этого не достаточно?

0 голосов
/ 31 мая 2019

В настоящее время ваш код захватывает все MeasId и увеличивает максимальное значение. Попробуйте установить фильтр where до метода select.

var measid = dataContext.MeasResults.Where(mr => mr.MoldID == id).Select(a => a.MeasId).Max() + 1;

Идея здесь в том, что вместо выбора максимального значения MeasId из всей таблицы вы сначала отфильтруете все записи, кроме измерений для MoldID, который вы записываете.


string id = ""; string plane = ""; int pos = 0; int dist = 0; double apert = 0;

id = comboBMouldID.SelectedValue.ToString();
plane = comboBSurface.SelectedItem.ToString();
pos = Convert.ToInt32(txtTravelPos.Text);

var tmpRecord = dataContext.MeasResults.Where(mr => mr.MoldID == id).OrderByDescending(mr => mr.MeasId).FirstOrDefault();
int measid = tmpRecord != null ? tmpRecord.MeasId + 1 : 1;

...

Оператор tmpRecord фильтрует таблицу MeasResults для всех записей с MoldID, равным выбранному идентификатору. Затем мы сортируем их в порядке убывания, используя MeasId в качестве столбца сортировки. Наконец, мы берем верхнюю запись или нулевую запись, если ее нет. Во второй строке сначала проверяется, что запись не равна нулю, затем она измеряет значение этой записи и увеличивает его на единицу. Если запись равна нулю, мы присвоим значение 1.

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