实体框架核心使用fromSql时如何传递参数列表

时间:2019-04-26 15:07:02

标签: entity-framework-core

我正在建立一个查询,该查询仅在值不为null时才包括某些字段。为了使这项工作有效,我只需要将实际查询所需的参数传递给查询。

到目前为止,这是我尝试过的操作,但是我收到一条错误消息,告诉我“ 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 :(得分:0)

您总体上做得正确。

就在这里

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()