编辑:代码更新
我有以下代码,但它不起作用,它会产生一个无限循环并添加数千行我想检查是否有任何行包含我指定的值,如果没有,插入它,如果是,只是更新两列。
您将获得Servicio.Value ==“PAS”的IF语句,因为,如果服务是“PAS”,它在表Umbrales上有一个名为modulo_id的列(其中包含插入所有内容),以及查询返回值更改为PAS表而不是Banksphere表...如果你知道一个更好的方法来处理这个,将会被赞赏,因为我觉得这太乱了..
checkcenterDBDataContext dc = new checkcenterDBDataContext();
int intOkMas = Convert.ToInt32(txtUmbralOkMas.Text);
int intOkMenos = Convert.ToInt32(txtUmbralOkMenos.Text);
var days = GetDaysLikeMe(DateTime.Today).Take(50).Where(d => d.Date.Day < 28 && d.Date.Day > 1).Take(4);
XDocument xDoc = XDocument.Load("Settings.xml");
var Entidades =
from ent in xDoc.Root.Elements("Entidad")
select ent;
foreach (var entidad in Entidades)
{
var Servicios =
from serv in entidad.Element("Servicios").Elements("ServName")
select serv;
foreach (var servicio in Servicios)
{
if (servicio.Value == "PAS")
{
Umbrales newUmbral = new Umbrales();
var Modulos =
from mod in entidad.Element("Servicios").Elements("ModName")
select mod;
foreach (var modulo in Modulos)
{
for (int i = 0; i <= 2; i++)
{
var valores =
from b in dc.PAS
where
b.Modulos.nombre == modulo.Value &&
b.Entidades.nombre == entidad.Element("Nombre").Value &&
b.peticion_id == i
&& days.Contains(Convert.ToDateTime(b.fecha))
orderby b.id descending
select b;
var medias =
from b in valores
group b.valor by new { b.hora_id, b.dia_id, b.entidad_id, b.modulo_id, b.peticion_id } into hg
orderby hg.Key.hora_id descending
select new
{
Hora = hg.Key.hora_id,
Dia = hg.Key.dia_id,
Entidad = hg.Key.entidad_id,
Modulo = hg.Key.modulo_id,
Peticion = hg.Key.peticion_id,
Maximo = Math.Round(System.Convert.ToDouble(hg.Average() + ((hg.Average() * intOkMas) / 100)), 3, MidpointRounding.AwayFromZero),
Minimo = Math.Round(System.Convert.ToDouble(hg.Average() - ((hg.Average() * intOkMenos) / 100)), 3, MidpointRounding.AwayFromZero)
};
foreach (var med in medias)
{
var update_medias =
(from um in dc.Umbrales
where
um.hora_id == med.Hora
&& um.dia_id == med.Dia
&& um.entidad_id == med.Entidad
&& um.servicio_id == 3
&& um.peticion_id == med.Peticion
&& um.modulo_id == med.Modulo
select um).ToList();
if (update_medias.Any())
{
foreach (var ume in update_medias)
{
ume.maximo = Convert.ToDecimal(med.Maximo);
ume.minimo = Convert.ToDecimal(med.Minimo);
dc.SubmitChanges();
}
}
else
{
newUmbral.hora_id = med.Hora;
newUmbral.dia_id = med.Dia;
newUmbral.entidad_id = med.Entidad;
newUmbral.servicio_id = 3;
newUmbral.peticion_id = med.Peticion;
newUmbral.modulo_id = med.Modulo;
newUmbral.maximo = Convert.ToDecimal(med.Maximo);
newUmbral.minimo = Convert.ToDecimal(med.Minimo);
dc.Umbrales.InsertOnSubmit(newUmbral);
dc.SubmitChanges();
}
}
}
}
}
else
{
Umbrales newUmbral = new Umbrales();
for (int i = 0; i <= 2; i++)
{
var valores =
from b in dc.Banksphere
where
b.Servicios.nombre == servicio.Value &&
b.Entidades.nombre == entidad.Element("Nombre").Value &&
b.peticion_id == i
&& days.Contains(Convert.ToDateTime(b.fecha))
orderby b.id descending
select b;
var medias =
from b in valores
group b.valor by new { b.hora_id, b.dia_id, b.entidad_id, b.servicio_id, b.peticion_id } into hg
orderby hg.Key.hora_id descending
select new
{
Hora = hg.Key.hora_id,
Dia = hg.Key.dia_id,
Entidad = hg.Key.entidad_id,
Servicio = hg.Key.servicio_id,
Peticion = hg.Key.peticion_id,
Maximo = Math.Round(System.Convert.ToDouble(hg.Average() + ((hg.Average() * intOkMas) / 100)), 3, MidpointRounding.AwayFromZero),
Minimo = Math.Round(System.Convert.ToDouble(hg.Average() - ((hg.Average() * intOkMenos) / 100)), 3, MidpointRounding.AwayFromZero)
};
foreach (var med in medias)
{
var update_medias =
(from um in dc.Umbrales
where
um.hora_id == med.Hora
&& um.dia_id == med.Dia
&& um.entidad_id == med.Entidad
&& um.servicio_id == med.Servicio
&& um.peticion_id == med.Peticion
select um).ToList();
if (update_medias.Any())
{
foreach (var ume in update_medias)
{
ume.maximo = Convert.ToDecimal(med.Maximo);
ume.minimo = Convert.ToDecimal(med.Minimo);
dc.SubmitChanges();
}
}
else
{
newUmbral.hora_id = med.Hora;
newUmbral.dia_id = med.Dia;
newUmbral.entidad_id = med.Entidad;
newUmbral.servicio_id = med.Servicio;
newUmbral.peticion_id = med.Peticion;
newUmbral.maximo = Convert.ToDecimal(med.Maximo);
newUmbral.minimo = Convert.ToDecimal(med.Minimo);
dc.Umbrales.InsertOnSubmit(newUmbral);
dc.SubmitChanges();
}
}
}
}
}
}
答案 0 :(得分:2)
update_medias
永远不会为空。试试这个:
var update_medias = (from um in dc.Umbrales
where
um.hora_id == med.Hora
&& um.dia_id == med.Dia
&& um.entidad_id == med.Entidad
&& um.servicio_id == med.Servicio
&& um.peticion_id == med.Peticion
select um).FirstOrDefault();
答案 1 :(得分:1)
update_medias
永远不会为null - 它始终是一个尚未执行的查询。将其更改为:
var update_medias =
(from um in dc.Umbrales
where
um.hora_id == med.Hora
&& um.dia_id == med.Dia
&& um.entidad_id == med.Entidad
&& um.servicio_id == med.Servicio
&& um.peticion_id == med.Peticion
select um).ToList();
然后用它来检查它而不是空检查
if (update_medias.Any())