April 24
¿Cómo se podría hacer con Dlinq el típico formulario de búsqueda por varios campos?
Muy fácil, se puede formar dinámicamente la consulta, al estilo procedimiento almacenado, pero todo desde Visual Studio, depurando y de una forma directa. Creo que realmente esto es un gran progreso respecto a como se realizaba anteriormente, ahí no hay conexiones, entlib.. ni nada por el estilo, se ataca la base de datos de una forma muy directa.
Código del botón buscar de la web (los cb son combos y los tb textbox):
protected void btBuscar_Click(object sender, EventArgs e)
{
var q = from p in db.PROYECTOS
from t in db.TRABAJOS
from pri in db.PRIORIDADES
from est in db.ESTADOS
where p.PROTRABAJO==t.TRAID && p.PROPRIORIDAD==pri.PRIID && p.PROESTADO==est.ESTID
select new{proexpediente=p.PROEXPEDIENTE,protrabajo=t.TRANOMBRE, prodescripcion=p.PRODESCRIPCION,
PRIORIDAD=pri.PRINOMBRE,ESTADO=est.ESTNOMBRE,
CLIID=p.CLIID,PROEXPEDIENTE=p.PROEXPEDIENTE,PRONUMVIVIENDAS=p.PRONUMVIVIENDAS,
LOCID=p.LOCID,CORID=p.CORID,PROFECHAALTA=p.PROFECHAALTA,PROESTADO=p.PROESTADO,PROID=p.PROID};
if (cbClientes.SelectedValue != "0")
{
q = q.Where(h=> h.CLIID == Convert.ToInt32(cbClientes.SelectedValue));
}
if (!string.IsNullOrEmpty(tbExpediente.Text))
{
q = q.Where(h=> h.PROEXPEDIENTE == tbExpediente.Text);
}
if (tbNumViviendas.Text != "0")
{
q = q.Where(h=> h.PRONUMVIVIENDAS == Convert.ToInt32(tbNumViviendas.Text));
}
if (cbLocalidades.SelectedValue != "0")
{
q = q.Where(h=> h.LOCID == Convert.ToInt32(cbLocalidades.SelectedValue));
}
if(cbCoordinador.SelectedValue!="0")
{
q = q.Where(h=> h.CORID == Convert.ToInt32(cbCoordinador.SelectedValue));
}
if(cbAño.SelectedValue!="0")
{
q = q.Where(h=> h.PROFECHAALTA.Year.ToString()== cbAño.SelectedValue);
}
if(!chboxIncluirTerminados.Checked)
{
q = q.Where(h=> h.PROESTADO != 2);
}
GridViewBuscados.DataSource = q;
GridViewBuscados.DataBind(); <-- Aquí ejecuta la consulta en la BBDD
}
Todo esto forma un sql muy correcto:
exec sp_executesql N'SELECT [t0].[PRO_EXPEDIENTE] AS [proexpediente], [t1].[TRA_NOMBRE] AS [protrabajo], [t0].[PRO_DESCRIPCION] AS [prodescripcion], [t2].[PRI_NOMBRE] AS [PRIORIDAD], [t3].[EST_NOMBRE] AS [ESTADO], [t0].[CLI_ID] AS [CLIID], [t0].[PRO_NUM_VIVIENDAS] AS [PRONUMVIVIENDAS], [t0].[LOC_ID] AS [LOCID], [t0].[COR_ID] AS [CORID], [t0].[PRO_FECHA_ALTA] AS [PROFECHAALTA], [t0].[PRO_ESTADO] AS [PROESTADO], [t0].[PRO_ID] AS [PROID]
FROM [PROYECTOS] AS [t0], [TRABAJOS] AS [t1], [PRIORIDADES] AS [t2], [ESTADOS] AS [t3]
WHERE ([t0].[PRO_ESTADO] <> @p0) AND ([t0].[PRO_TRABAJO] = [t1].[TRA_ID]) AND ([t0].[PRO_PRIORIDAD] = [t2].[PRI_ID]) AND ([t0].[PRO_ESTADO] = [t3].[EST_ID])',N'@p0 int',@p0=2
El linq realmente va a cambiar la forma de hacer los programas....