Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Lambda.NET语法中调用用户定义函数_C#_.net_Linq_Linq To Sql_Lambda - Fatal编程技术网

C# 如何在Lambda.NET语法中调用用户定义函数

C# 如何在Lambda.NET语法中调用用户定义函数,c#,.net,linq,linq-to-sql,lambda,C#,.net,Linq,Linq To Sql,Lambda,好的,这是我的问题。我有一个数据库表BloodCenters,它有纬度和经度字段。我想使用Linq Lambda语法查询这些表,检索相对于某个点在给定半径内的血心 我正在使用这段代码,但它仍然给我错误(在Where谓词中): 这将不起作用,因为Util.distance是在您的C#代码中实现的,而查询表面不知道如何将其转换为SQL(或者即使可能) 一个直接的解决方法是从数据库中获取所有记录并将谓词应用于实例,如下所示: res = new DBEntities().BloodCenters.To

好的,这是我的问题。我有一个数据库表
BloodCenters
,它有
纬度
经度
字段。我想使用Linq Lambda语法查询这些表,检索相对于某个点在给定半径内的血心

我正在使用这段代码,但它仍然给我错误(在Where谓词中):


这将不起作用,因为
Util.distance
是在您的C#代码中实现的,而查询表面不知道如何将其转换为SQL(或者即使可能)

一个直接的解决方法是从数据库中获取所有记录并将谓词应用于实例,如下所示:

res = new DBEntities().BloodCenters.ToList()
          .Where(b => Util.distance(latitude, longitude, b.Latitude, b.Longitude, "K") <= radius)
          .Take(limit);
return res;
res=new DBEntities().BloodCenters.ToList()

其中(b=>Util.distance(纬度、经度、b.纬度、b.经度,“K”)您必须将
DBEntities().BloodCenters
转换为
IEnumerable
List
或本地存储的其他内容。Linq to SQL将C#转换为SQL,因此您只能使用SQL服务器提供的函数


另一种方法是用可翻译语句模拟函数,或者在数据库(存储过程或类似的)上实现它

纬度和经度为
int
?您应该尝试使用sql server空间数据类型,而不是一些托管代码函数谢谢您的解释。不幸的是,我在您的链接上没有看到任何三角函数。我通过提供
Util.Distance
实现的详细信息编辑了我的问题。
public static double distance(double lat1, double longi1, double lat2, double longi2, string unit){
    var theta = longi1 - longi2;
    var dist = Math.Sin(DegreeToRadian(lat1)) * Math.Sin(DegreeToRadian(lat2)) +
        Math.Cos(DegreeToRadian(lat1)) * Math.Cos(DegreeToRadian(lat2)) * Math.Cos(DegreeToRadian(theta));
    dist = Math.Acos(dist);
    dist = RadianToDegree(dist);
    var miles = dist * 60 * 1.1515;
    unit = unit.ToUpper();
    if (unit.Equals("K"))
        return miles * 1.609344;
    else if (unit.Equals("N"))
        return miles * 0.8684;
    else
        return miles;
}
res = new DBEntities().BloodCenters.ToList()
          .Where(b => Util.distance(latitude, longitude, b.Latitude, b.Longitude, "K") <= radius)
          .Take(limit);
return res;