根据外键具体增加ID值

时间:2019-05-31 13:50:20

标签: c# sql linq

我有两个数据库表;一个叫Mould,另一个叫MeasResult。 模具表具有MID作为主键,MeasResult表具有名为MoldID的外键,该外键引用了MID。 我正在使用此外键将测量记录到MeasResult表中。 MeasResult表还具有一个MeasID列,用于跟踪测量插入计数。对于每次测量,我都会记录50行数据。 我需要的是,每次注意MoldID(表中的外键),每次记录新的测量值时,都需要将此MeasID值增加1。

我当前的代码不介意外键,它只是为每个测量日志将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();
                }

如何更改代码,以便针对特定MoldID进行的每次测量都会使MeasID增加1?

2 个答案:

答案 0 :(得分:0)

当前,您的代码正在获取所有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语句为MeadResults表过滤所有MoldID等于所选ID的记录。然后,我们使用MeasId作为排序列对它们进行降序排序。最后,我们采用最高记录或空记录(如果不存在)。第二行首先检查记录是否为空,然后它将获取该记录的MeasId并将其递增1。如果记录为空,那么我们将分配值1。

答案 1 :(得分:0)

然后,根据您的回答,它应该非常简单。

使用此MoldID计算现有记录数:

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

然后将该值分配为新记录的MeasId。 这样就够了吗?