Semplificazione della ricerca dei dati tramite .NET

0

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?

    
posta Peter 13.06.2014 - 11:18
fonte

1 risposta

1

Sembra che tu stia cercando Ricerca full-text .

After columns have been added to a full-text index, users and applications can run full-text queries on the text in the columns. These queries can search for any of the following:

  • One or more specific words or phrases (simple term)
    
risposta data 13.06.2014 - 11:38
fonte

Leggi altre domande sui tag