TL; DR: Попробуйте использовать Html.Partial
вместо Renderpage
Я получал Object reference not set to an instance of an object
, когда пытался сделать вид в представлении, отправив ему модель, например это:
@{
MyEntity M = new MyEntity();
}
@RenderPage("_MyOtherView.cshtml", M); // error in _MyOtherView, the Model was Null
Отладка показала, что модель была Null внутри MyOtherView. Пока я не сменил его на:
@{
MyEntity M = new MyEntity();
}
@Html.Partial("_MyOtherView.cshtml", M);
И это сработало.
Кроме того, причина, по которой я не имел Html.Partial
для начала, заключалась в том, что Visual Studio иногда выдает ошибки, (f9), если он находится внутри другого построенного цикла foreach
, хотя это не ошибка:
@inherits System.Web.Mvc.WebViewPage
@{
ViewBag.Title = "Entity Index";
List<MyEntity> MyEntities = new List<MyEntity>();
MyEntities.Add(new MyEntity());
MyEntities.Add(new MyEntity());
MyEntities.Add(new MyEntity());
}
<div>
@{
foreach(var M in MyEntities)
{
// Squiggly lines below. Hovering says: cannot convert method group 'partial' to non-delegate type Object, did you intend to envoke the Method?
@Html.Partial("MyOtherView.cshtml");
}
}
</div>
Но я смог запустить приложение без проблем с этим " ошибка". Я смог избавиться от ошибки, изменив структуру цикла foreach
, чтобы выглядеть так:
@foreach(var M in MyEntities){
...
}
Хотя я чувствую, что это потому, что Visual Studio неправильно интерпретировала амперсанды и скобки .
По MUL вы имеете в виду прогрессивное умножение значений?
Даже при 100 строках небольшого размера (скажем, 10) ваш MUL (столбец) будет переполнять любой тип данных! С такой высокой вероятностью неправильного использования и ограниченного объема использования, он не должен быть стандартом SQL. Как показали другие, существуют математические способы его разработки, так же как есть много способов сделать сложные вычисления в SQL, используя стандартные (и общеупотребительные) методы.
Пример данных:
Column
1
2
4
8
COUNT : 4 items (1 for each non-null)
SUM : 1 + 2 + 4 + 8 = 15
AVG : 3.75 (SUM/COUNT)
MUL : 1 x 2 x 4 x 8 ? ( =64 )
Для полноты реализации реализации ядра Oracle, MSSQL, MySQL *
Oracle : EXP(SUM(LN(column))) or POWER(N,SUM(LOG(column, N)))
MSSQL : EXP(SUM(LOG(column))) or POWER(N,SUM(LOG(column)/LOG(N)))
MySQL : EXP(SUM(LOG(column))) or POW(N,SUM(LOG(N,column)))
* LOG (0) и LOG (-ve) не определены. Ниже показано только, как обрабатывать это в SQL Server. Эквиваленты можно найти для других ароматов SQL, используя ту же концепцию
create table MUL(data int)
insert MUL select 1 yourColumn union all
select 2 union all
select 4 union all
select 8 union all
select -2 union all
select 0
select CASE WHEN MIN(abs(data)) = 0 then 0 ELSE
EXP(SUM(Log(abs(nullif(data,0))))) -- the base mathematics
* round(0.5-count(nullif(sign(sign(data)+0.5),1))%2,0) -- pairs up negatives
END
from MUL
Ингредиенты:
1 for >0
, 0 for 0
и -1 for <0
. Добавим еще 0.5 и снова возьмем знак (), поэтому теперь мы классифицируем 0 и 1 как 1, а только -1 как -1. снова используйте NULLIF для удаления из COUNT () 1, так как нам нужно только подсчитать негативы. % 2
против count () отрицательных чисел возвращает либо -> 1, если есть нечетное число отрицательных чисел -> 0, если четное число отрицательных чисел больше математических трюков: мы принимаем 1 или 0 от 0,5 , так что приведенное выше становится -> (0.5-1=-0.5
=> round до -1), если существует нечетное число отрицательных чисел -> (0.5-0= 0.5
=> round to 1), если существует четное число отрицательных чисел числа мы умножаем этот окончательный 1 / -1 на значение SUM-PRODUCT для реального результата Вы довольно быстро сломаете любой тип данных, поскольку числа монтируются вверх.
Использование LOG / EXP сложно из-за чисел & lt; = 0, которые будут сбой при использовании LOG. Я написал решение в этого вопроса , касающееся этого
С помощью PostgreSQL вы можете создавать свои собственные агрегатные функции, см. http://www.postgresql.org/docs/8.2/interactive/sql-createaggregate.html
Чтобы создать агрегатную функцию в MySQL, вам нужно будет создать файл .so (linux) или .dll (windows). Пример показан здесь: http://www.codeproject.com/KB/database/mygroupconcat.aspx
Я не уверен в mssql и oracle, но я ставлю они также имеют возможность создавать собственные агрегаты.
Нет, но вы можете использовать математику:)
, если yourColumn
всегда больше нуля:
select EXP(SUM(LOG(yourColumn))) As ColumnProduct from yourTable
Использование CTE в MS SQL:
CREATE TABLE Foo(Id int, Val int)
INSERT INTO Foo VALUES(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)
;WITH cte AS
(
SELECT Id, Val AS Multiply, row_number() over (order by Id) as rn
FROM Foo
WHERE Id=1
UNION ALL
SELECT ff.Id, cte.multiply*ff.Val as multiply, ff.rn FROM
(SELECT f.Id, f.Val, (row_number() over (order by f.Id)) as rn
FROM Foo f) ff
INNER JOIN cte
ON ff.rn -1= cte.rn
)
SELECT * FROM cte
Я вижу, что ответ Oracle по-прежнему отсутствует, поэтому вот он:
SQL> with yourTable as
2 ( select 1 yourColumn from dual union all
3 select 2 from dual union all
4 select 4 from dual union all
5 select 8 from dual
6 )
7 select EXP(SUM(LN(yourColumn))) As ColumnProduct from yourTable
8 /
COLUMNPRODUCT
-------------
64
1 row selected.
С уважением, Роб.
Не уверен насчет Oracle или sql-server, но в MySQL вы можете просто использовать *
, как обычно.
mysql> select count(id), count(id)*10 from tablename;
+-----------+--------------+
| count(id) | count(id)*10 |
+-----------+--------------+
| 961 | 9610 |
+-----------+--------------+
1 row in set (0.00 sec)