Entity Framework Core, как вы передаете список параметров при использовании fromSql - PullRequest
1 голос
/ 26 апреля 2019

Я строю запрос, который должен включать только определенные поля, если значение не является нулевым. Чтобы сделать это, мне нужно передать в запрос только те параметры, которые необходимы для фактического запроса.

Это то, что я пробовал до сих пор, но я получаю сообщение об ошибке "SqlException: необходимо объявить скалярную переменную" @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;
        }

1 Ответ

0 голосов
/ 26 апреля 2019

В общем, вы делаете это правильно.

Просто здесь

RowCount = _db.Restaurants.FromSql(query).ToList().Count

вы забыли передать параметры, как вы это сделали

pagedResult.Results = _db.Restaurants.FromSql(queryWithPagination, parameters.ToArray()).ToList();

, отсюда исключение.

Так что просто предоставьте их на первый звонок.Кроме того (не имеет отношения) вам не нужно материализовать результат (ToList) только для того, чтобы получить Count - FromSql, возвращающий IQueryable<>, поэтому используйте вместо этого Count() запрашиваемый метод расширения, чтобы запрос LINQ был переведенв SQL и оценивается на стороне сервера:

RowCount = _db.Restaurants.FromSql(query, parameters.ToArray()).Count()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...