如何在SQL where子句中调用函数/过程

本文关键字:调用 函数 过程 子句 SQL where | 更新日期: 2023-09-27 17:51:09

我已经卡住了最后一点,而试图调用一个函数在我的sql查询。理想情况下,我想做以下事情:

from c in db.items
where calcDistance(c.Latitude, c.Longitude, Latitude, Longitude) =< radius
select ...

然而,据我所知,我不能在where子句中调用本地c#函数。我做了一些研究,并尝试创建一个存储过程来调用用户定义的函数,该函数的功能如下所示:

CREATE PROCEDURE dbo.DistanceProc
    @lat1 decimal,
    @long1 decimal,
    @lat2 decimal,
    @long2 decimal
AS
    DECLARE @return FLOAT
    SET @return = dbo.Distance(@lat1, @long1, @lat2, @long2)
SELECT @return
dbo

。Distance是我的用户定义函数,其逻辑与我原来的c#函数相同。然后我试图添加一个函数导入,但没有标量类型FLOAT,我试图返回一个双精度。然后尝试使用以下代码:

from c in db.items
where radius >=  db.DistanceProc(c.Latitude, c.Longitude, Latitude, Longitude)
select ...

但是,db.DistanceProc()返回的类型是System.Data.Entity.Core.Objects.ObjectResult<double?>而且不是普通的替身。我试图添加一个。cast (). firstordefault()到此,但它无法转换为存储表达式。

在这一点上,我几乎被想法困住了。有没有简单的方法可以做到这一点?我所需要的就是在数据库中的每个项目的where子句中执行这个额外的距离计算逻辑。我也在考虑只是返回IEnumerable中的所有项目,然后在本地运行逻辑,但由于DB相当大,返回每个项目是不可行的。

谢谢!

编辑:

我还尝试在msdn上使用这些指令调用UDF而不是存储过程,但它仍然不起作用。它可以很好地编译,但是在运行时它抛出NotSupportedException,并带有以下消息:

LINQ到实体无法识别方法'System. nullable ' 1[System. null](系统)的距离的两倍。小数,系统。小数,系统。Decimal, System.Decimal)'方法,并且该方法不能转换为存储表达式。

任何想法?

如何在SQL where子句中调用函数/过程

您需要在where子句中调用sql函数,而不能调用存储过程。

from c in db.items
where radius >=  db.Distance(c.Latitude, c.Longitude, Latitude, Longitude) -- CALL function instead of procedure