Cómo cambiar la condición de 2 ESQL donde cláusulas en la expresión final?
-
02-10-2019 - |
Pregunta
Tengo una consulta bastante compleja donde estoy filtrando resultados con una instrucción LIKE. Ésta es la consulta:
var qsFilter = entities.QueryStatements.Where("it.Statement LIKE @searchTerm",
new ObjectParameter("searchTerm", searchTerm));
var qtFilter = entities.QueryTables.Where("it.TableNames LIKE @searchTables",
new ObjectParameter("searchTables", searchTerm));
Y a continuación:
var tables = from t in entities.TraceLines
join qs in qsFilter on t.QueryStatementHash equals qs.QueryStatementHash
join qt in qtFilter on qs.QueryTableHash equals qt.QueryTableHash
where t.CallTypeId == 64
orderby t.Sequence
select new
{
Name = qt.TableNames
};
El problema es que en la consulta final, se genera una cláusula AND para los 2 filtros como:
WHERE ([Filter1].[Statement] LIKE @searchTerm) AND
([Extent3].[TableNames] LIKE @searchTables)
¿Cómo consigo que sea un o cláusula?
Nota: si usted se está preguntando por qué estoy usando ESQL aquí, es debido a esto: Como utilizar SQL 'como' con LINQ a entidades?
Solución
A pesar de mi experiencia LinqToEntities se limita, mi lectura de los materiales de referencia sugiere que este trabajo puede:
var joins =
from t in entities.TraceLines
join qs in entities.QueryStatements
on t.QueryStatementHash equals qs.QueryStatementHash
join qt in entities.QueryTables
on qs.QueryTableHash equals qt.QueryTableHash
select new {t, qs, qt};
var filtered = joins
.Where("it.Statement LIKE @searchTerm OR it.TableNames LIKE @searchTables"
new ObjectParameter("searchTerm", searchTerm)
new ObjectParameter("searchTables", searchTerm))
.Where(x => x.t.CallTypeId == 64)
var orderedAndProjected =
from x in filtered
order by x.t.Sequence
select new
{
Name = qt.TableNames
};
Estoy desconcertado a lo que el "que" es en esas cadenas opacos. Qué extraña elección de palabras de código.
Por supuesto, si se cambia a LinqToSql, sólo tiene que escribir esto (pero ya sabía que):
var query =
from t in myDC.TraceLines
from qs in t.QueryStatements
from qt in qs.QueryTables
where t.CallTypeId == 64
where SqlMethods.Like(qs.Statement, searchTerm)
|| SqlMethods.Like(qt.SearchTables, searchTerm)
order by t.Sequence
select new
{
Name = qt.TableNames
};