Un esempio sul sito asp.net ha un esempio di utilizzo Linq per creare una funzione di ricerca in un sito di album musicale utilizzando MVC. Il codice è simile a questo -
public ActionResult Index(string movieGenre, string searchString)
{
var GenreLst = new List<string>();
var GenreQry = from d in db.Movies
orderby d.Genre
select d.Genre;
GenreLst.AddRange(GenreQry.Distinct());
ViewBag.movieGenre = new SelectList(GenreLst);
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.Title.Contains(searchString));
}
if (!string.IsNullOrEmpty(movieGenre))
{
movies = movies.Where(x => x.Genre == movieGenre);
}
return View(movies);
}
Ho visto esempi simili in altri tutorial e li ho provati in un'app business reale che sviluppo / mantengo. In pratica questo modello non sembra scalare bene perché man mano che il criterio di ricerca si espande, continuo ad aggiungere sempre più condizioni che appaiono sgradevoli e ripetitive. Come posso refactoring questo modello?
Un'idea che ho è di creare una colonna in ogni tabella che è "ricercabile" che potrebbe essere una colonna calcolata che concatena tutti i dati dalle diverse colonne (SQL Server 2008). Quindi, invece di avere il genere e il titolo del film, sarebbe qualcosa di simile.
if (!String.IsNullOrEmpty(searchString))
{
movies = movies.Where(s => s.SearchColumn.Contains(searchString));
}
Quali sono le implicazioni di prestazioni / design / architettura di questo?
Ho anche provato a usare procedure che usano query dinamiche, ma poi ho appena spostato la bruttezza nel database. Per es.
CREATE PROCEDURE [dbo].[search_music]
@title as varchar(50),
@genre as varchar(50)
AS
-- set the variables to null if they are empty
IF @title = '' SET @title = null
IF @genre = '' SET @genre = null
SELECT m.*
FROM view_Music as m
WHERE
(title = @title OR @title IS NULL)
AND (genre LIKE '%' + @genre + '%' OR @genre IS NULL)
ORDER BY Id desc
OPTION (RECOMPILE)
Qualche suggerimento? Consigli?