Je construis une requête qui ne devrait inclure certains champs que si une valeur n'est pas nulle. Pour que cela fonctionne, je dois transmettre à la requête uniquement les paramètres nécessaires à la requête réelle.
C'est ce que j'ai essayé jusqu'à présent, mais je reçois une erreur me disant "SqlException: doit déclarer la variable scalaire" @registrationStatus "."
public PagedResult<Restaurant> PaginatedResults(int page, string searchTerm, string accountStatus, string registrationStatus)
{
var parameters = new List<SqlParameter>();
var query = "SELECT * FROM Restaurant WHERE Name != '' ";
// Search term
if (!String.IsNullOrEmpty(searchTerm))
{
query += "AND (Name LIKE @searchTerm OR ContactName LIKE @searchTerm OR Email LIKE @searchTerm) ";
parameters.Add(new SqlParameter("@searchTerm", SqlDbType.VarChar) { Value = $"%{searchTerm}%" });
}
// Account status
if (!String.IsNullOrEmpty(accountStatus))
{
var enabled = accountStatus.Equals("ACTIVE") ? 1 : 0;
query += "AND Enabled = @enabled ";
parameters.Add(new SqlParameter("@enabled", SqlDbType.Bit) { Value = enabled});
}
// Registration status
if (!String.IsNullOrEmpty(registrationStatus))
{
query += "AND RegistrationStatus = @registrationStatus ";
parameters.Add(new SqlParameter("@registrationStatus", SqlDbType.VarChar) { Value = registrationStatus });
}
var pagedResult = new PagedResult<Restaurant>
{
CurrentPage = page,
PageSize = 20,
RowCount = _db.Restaurants.FromSql(query).ToList().Count
};
// Pagination
var queryWithPagination = query + "ORDER BY Id OFFSET @offset ROWS FETCH NEXT @pageSize ROWS ONLY";
parameters.Add(new SqlParameter("@offset", SqlDbType.Int) { Value = pagedResult.Offset()});
parameters.Add(new SqlParameter("@pageSize", SqlDbType.Int) { Value = pagedResult.PageSize});
pagedResult.Results = _db.Restaurants.FromSql(queryWithPagination, parameters.ToArray()).ToList();
return pagedResult;
}
Vous le faites correctement en général.
Juste ici
RowCount = _db.Restaurants.FromSql(query).ToList().Count
vous avez oublié de passer les paramètres comme vous l'avez fait ici
pagedResult.Results = _db.Restaurants.FromSql(queryWithPagination, parameters.ToArray()).ToList();
d'où l'exception.
Fournissez-les donc simplement au premier appel. De plus (sans rapport), vous n'avez pas besoin de matérialiser le résultat ( ToList
) juste pour obtenir le Count
- FromSql
renvoie IQueryable<>
, utilisez donc la méthode d'extension interrogable Count()
à la place pour laisser la requête LINQ être traduite en SQL et évaluée côté serveur :
RowCount = _db.Restaurants.FromSql(query, parameters.ToArray()).Count()