如何在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
在这一点上,我几乎被想法困住了。有没有简单的方法可以做到这一点?我所需要的就是在数据库中的每个项目的where子句中执行这个额外的距离计算逻辑。我也在考虑只是返回IEnumerable中的所有项目,然后在本地运行逻辑,但由于DB相当大,返回每个项目是不可行的。
谢谢!
编辑:我还尝试在msdn上使用这些指令调用UDF而不是存储过程,但它仍然不起作用。它可以很好地编译,但是在运行时它抛出NotSupportedException,并带有以下消息:
LINQ到实体无法识别方法'System. nullable ' 1[System. null](系统)的距离的两倍。小数,系统。小数,系统。Decimal, System.Decimal)'方法,并且该方法不能转换为存储表达式。
任何想法?
您需要在where子句中调用sql函数,而不能调用存储过程。
from c in db.items
where radius >= db.Distance(c.Latitude, c.Longitude, Latitude, Longitude) -- CALL function instead of procedure