Возможно, вы также можете сделать это в хранимой процедуре:
DROP PROCEDURE IF EXISTS median;
DELIMITER //
CREATE PROCEDURE median (table_name VARCHAR(255), column_name VARCHAR(255), where_clause VARCHAR(255))
BEGIN
-- Set default parameters
IF where_clause IS NULL OR where_clause = '' THEN
SET where_clause = 1;
END IF;
-- Prepare statement
SET @sql = CONCAT(
"SELECT AVG(middle_values) AS 'median' FROM (
SELECT t1.", column_name, " AS 'middle_values' FROM
(
SELECT @row:=@row+1 as `row`, x.", column_name, "
FROM ", table_name," AS x, (SELECT @row:=0) AS r
WHERE ", where_clause, " ORDER BY x.", column_name, "
) AS t1,
(
SELECT COUNT(*) as 'count'
FROM ", table_name, " x
WHERE ", where_clause, "
) AS t2
-- the following condition will return 1 record for odd number sets, or 2 records for even number sets.
WHERE t1.row >= t2.count/2
AND t1.row <= ((t2.count/2)+1)) AS t3
");
-- Execute statement
PREPARE stmt FROM @sql;
EXECUTE stmt;
END//
DELIMITER ;
-- Sample usage:
-- median(table_name, column_name, where_condition);
CALL median('products', 'price', NULL);
Если вы хотите использовать свойства моделей представления в javascript, вам нужно конвертировать его, например,
var datos = JSON.stringify(@Model.Data);
var etiquetas = JSON.stringify(@Model.Labels);
Или вы можете использовать
var datos = @Html.Raw(Json.Serialize(@Model.Data));
var etiquetas = @Html.Raw(Json.Serialize(@Model.Labels));
Чтобы передать массив на стороне сервера в переменную массива на стороне клиента, вы можете использовать функцию JSON.parse()
на стороне клиента с Json.Encode()
:
var datos = JSON.parse(@Html.Raw(Json.Encode(Model.Data));
var etiquetas = JSON.parse(@Html.Raw(Json.Encode(Model.Labels));
Или, если у вас есть пакет Newtonsoft.Json
, вы следует попробовать использовать метод JsonConvert.SerializeObject()
:
var datos = JSON.parse(@Html.Raw(JsonConvert.SerializeObject(Model.Data));
var etiquetas = JSON.parse(@Html.Raw(JsonConvert.SerializeObject(Model.Labels));
Если массив передается напрямую, как @Model.Data
, неявно вызывается ToString()
, что приводит к полному определению имени типа массива назначаться вместо содержимого сериализованного массива.
У вас здесь необычное сочетание JavaScript и C #.
Обычно вы выбираете данные из конечной точки WebAPI.
Самым простым (наименьшим) исправлением было бы
// in the controller
vm.Data = JsonConvert.Serialize( DataReporting(vm));
vm.Labels = JsonConvert.Serialize(LabelReporting(vm));
Вам нужно будет сделать данные и метки простыми string
свойствами.
// in the View
var datos = JSon.Parse(@Model.Data);
var etiquetas = JSon.Parse(@Model.Labels );
Обратите внимание, что это не было проверено.
Как показано в документации к chart.js , здесь есть ссылка на документацию по chart.js , вы должны предоставить набор данных и метку в формате массива.
Попробуйте использовать передачу ienumerable для передачи модели для просмотра, что повлияет на преобразование в массив. Вашему классу должно понравиться это
public class ReportViewModel {
public innumerable<data> cData { get; set; }
public innumerable<label> cdata { get; set; }
}
И ваш класс для данных и метки должен быть определен в пространстве имен модели Модель данных:
Public class data{
Public int value{get;set;}
}
Модель метки
Public class label{
Public string name{get;set;}
}
И с учетом этого вы должны импортировать модель, которую необходимо передать из контроллера, и вы можете напрямую использовать ее, а используя механизм бритвы, вы можете преобразовать ее также в массив во время выполнения с помощью функции toarray