C# 将数学公式传递给实体框架

C# 将数学公式传递给实体框架,c#,entity-framework,C#,Entity Framework,我在函数中编写一个公式,并将其传递给EF查询。它不起作用。但是像Math.Pow(x,x)这样的函数是有效的。为什么?我是否必须在查询中直接集成公式 var i = from u in Locations where (SquareRoot(u.SomeField) < radius) select u; public double SquareRoot(double val) { return Math.Pow(val, 0.5); }

我在函数中编写一个公式,并将其传递给EF查询。它不起作用。但是像Math.Pow(x,x)这样的函数是有效的。为什么?我是否必须在查询中直接集成公式

var i = from u in Locations
    where (SquareRoot(u.SomeField) < radius)
    select u;

    public double SquareRoot(double val)
    {
    return Math.Pow(val, 0.5);
    }

EF不支持Math.Sqrt()和Math.Cos。

,因为框架无法理解如何将方法转换为SQL。您对框架的要求太高,无法做到这一点。当查询提供程序在表达式树(
expression.call
)中遇到对某个方法的调用时,它会注意到被调用的方法不是它知道如何解析并相应地吐出的方法

但是,提供的查询确实知道如何将
Math.Pow
转换为
POWER
,因为它就是这样设计的


这真的很简单。

那么整合我将在查询中使用的任何公式?这是唯一的方法吗?@Shawn Mclean:你可以在服务器上尝试一个用户定义的函数,然后通过EF将它拉到你的模型中。(我从来没有这样做过,因为我不喜欢服务器上的业务逻辑,但这是一种选择。)你能帮我吗?
Math.Pow(u.Latitude,0.5)
真的有意义吗?我简化了公式,但遇到的问题是
Math.Sqrt
不受支持。这和平方根是一样的。我知道,我很惊讶纬度的平方根是有意义的,特别是与半径相比,但你似乎只是在编一个例子,而不是用实际的东西,这很好。
var i = from u in Locations
    where (Math.Pow(u.SomeField, 0.5) < radius)
    select u;
public double DistanceBetweenPoints(double centerLat, double centerLon, double pointLat, double pointLon)
{
    const double sphericalValue = 69.1;
    return Math.Sqrt((Math.Pow(sphericalValue*(pointLat-centerLat), 2)) + (Math.Pow(sphericalValue*(pointLon-centerLon)*Math.Cos(centerLat/57.3), 2)));
}