如何在我的可视 C# Web 服务中为我的 android 应用程序调用 LINQ 中的用户定义函数?
Posted
技术标签:
【中文标题】如何在我的可视 C# Web 服务中为我的 android 应用程序调用 LINQ 中的用户定义函数?【英文标题】:How to call user defined function in LINQ in my visual C# web service for my android application? 【发布时间】:2012-03-20 14:52:40 【问题描述】:我目前正在开发一个应用程序,该应用程序将根据距离检索其他用户的位置。
我有一个以纬度和经度存储所有用户位置信息的数据库。 由于这两对经纬度之间的距离计算相当复杂,我需要一个函数来处理它。
from a in db.Location.Where(a => (calDistance(lat, longi, Double.Parse(a.latitude), Double.Parse(a.longitude)))<Math.Abs(distance) )) ...
但是,我收到以下错误:LINQ to Entities 无法识别该方法,并且该方法无法转换为存储表达式。
我不知道怎么翻译成商店表达式,而且计算还需要数学库。
有什么方法可以让 LINQ 表达式调用我自己的函数吗?
也许还有其他方法可以实现我的目标,有人可以帮忙吗?
【问题讨论】:
【参考方案1】:LinqToEntities 不允许你调用函数,它甚至不允许 ToString()
这不是 Linq 的事情,它是 LinqToEntities 限制
您可以将代码作为存储过程或函数放入数据库并使用 ExecuteStoreQuery 调用它
看这里Does Entity Framework Code First support stored procedures?
【讨论】:
【参考方案2】:我不太了解 LINQ,但假设您只能在查询中发送简单的约束,我将构建一个基本上与 calDistance 相反的方法 - 获取坐标和距离并将其转换为边界框具有最小经度、最大经度、最小纬度和最大纬度。
您应该能够构建一个简单的查询,满足您的这些限制。
类似的东西(在这里使用 Java):
public double[] getCoordinateBounds(double distance, double longitude, double latitude)
double[] bounds = new double[4];
bounds[0] = longitude - distanceToLongitudePoints * (distance);
bounds[1] = longitude + distanceToLongitudePoints * (distance);
bounds[2] = latitude - distanceToLatitudePoints * (distance);
bounds[3] = latitude + distanceToLatitudePoints * (distance);
return bounds;
然后你可以构造一个查询。
double[] bounds = getCoordinateBounds(distance, longi, lat);
var nearbyUserLocations = from a in db.Location
where longitude > bounds[0] and longitude < bounds[1]
and latitude > bounds[2] and latitude < bounds[3]
这将为您提供一盒点而不是点半径,但它的点数足够少,您可以处理它们并丢弃半径之外的点。或者您可能会认为一个盒子足以满足您的目的。
【讨论】:
【参考方案3】:您看到的问题是 LINQ to SQL 引擎试图从您的用户定义函数中注入 T-SQL,但它不能。一个(尽管很糟糕)选项是检索您的所有位置,然后根据该结果集进行计算。
var locations = db.Location.ToList();
locations = locations.Where(a => (calDistance(lat, longi, Double.Parse(a.latitude), Double.Parse(a.longitude))).ToList();
【讨论】:
有把整个表加载到内存中的效果,砰 这就是为什么我说它很讨厌。以上是关于如何在我的可视 C# Web 服务中为我的 android 应用程序调用 LINQ 中的用户定义函数?的主要内容,如果未能解决你的问题,请参考以下文章
如何检查系统上是不是存在电池,然后在 C# 中为我的 WPF 应用程序获取电池百分比
当我在我的 Web 应用程序中发送 Ajax 请求时,控制器端会在 laravel 的请求参数中为我提供脚本
如何在我的 podfile 中为我的 Xcode 项目指定多个目标?