Как вы поняли, Entity Framework не может запустить ваш код C # как часть его запроса. Он должен иметь возможность преобразовать запрос в фактический оператор SQL. Чтобы это сработало, вам придется реструктурировать выражение запроса в выражение, которое может обрабатывать Entity Framework.
public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
{
string name = this.charityName;
string referenceNumber = this.referenceNumber;
return p =>
(string.IsNullOrEmpty(name) ||
p.registeredName.ToLower().Contains(name.ToLower()) ||
p.alias.ToLower().Contains(name.ToLower()) ||
p.charityId.ToLower().Contains(name.ToLower())) &&
(string.IsNullOrEmpty(referenceNumber) ||
p.charityReference.ToLower().Contains(referenceNumber.ToLower()));
}
Ваш оригинальный пост был совершенно нечитабельным и хаотичным. Мне потребовалось время, чтобы отредактировать его и понять, чего вы пытаетесь достичь. Однако я постараюсь вам помочь. Давайте пошагово пошагово:
find
таким образом. Возможно, вы пытались векторизовать функцию g
? Обратите внимание, что Scilab по умолчанию не передает функции через массивы. Вам нужно либо векторизовать их, либо использовать feval
для этого. Пожалуйста, прочитайте этот другой ответ , который я написал ранее. find
- это векторизованная операция, применяемая к массиву, логическая операция и скаляр, поиск элементов массива, которые удовлетворяют операции. Например, из на странице find
: beers = ["Desperados", "Leffe", "Kronenbourg", "Heineken"];
find(beers == "Leffe")
возвращает 2
, а
A = rand(1, 20);
w = find(A < 0.4)
возвращает те элементы массива A
, которые меньше, чем 0.4
.
if, then, elsif, else, end
утверждениях. Если вы изучите это, вы не будете использовать функцию find
таким образом. Иногда у вас так много if
строк подряд, вместо этого попробуйте использовать select, case, else, end
. Ваша вторая функция может быть записана как: function y = g(x)
if x < 5 | 50 < x then
error("Out of range");
elseif x <= 11 then
y = -59.535905 + 24.763399 * x - 3.135727 * x^2 + 0.1288967 * x^3;
return;
elseif x <= 12 then
y = 1023.4465 - 270.59543 * x + 23.715076 * x^2 - 0.684764 * x^3;
return;
elseif x <= 17 then
y = -307.31448 + 62.094807 * x - 4.0091108 * x^2 + 0.0853523 * x^3;
return;
else
y = 161.42601 - 20.624104 * x + 0.8567075 * x^2 - 0.0100559 * x^3;
end
endfunction
30
. Хотя существуют методы для нахождения этих точек, автоматическое построение может быть очень полезным для нахождения правильного диапазона: t = [5:50];
plot(t, feval(t, g) - 30)
blockquote>, показывающий, что оба решения находятся в диапазоне
20 < x1 < 30
и40 < x < 50
.
- Теперь, если мы используем
fsolve
с правильными начальными значениями, это дает нам хорошие результаты:--> deff('[y] = g2(x)', 'y = g(x) - 30'); --> fsolve([25; 45], g2) ans = 26.67373 48.396547
- Третий параметр
fsolve
функция является якобинской / производной функцииg(x)
. Вы должны либо вычислить производные вышеприведенных полиномов вручную (либо использовать соответствующее символическое программное обеспечение, такое как Maxima), либо определить их как полиномы с помощью функцииpoly
. См. это руководство , например. Затем дифференцируйте их, определяя новую функцию, подобнуюdgdx
.