如何在 IQueryable 对象上调用 LINQ 查询的 where 子句中的方法
我有一个通过 EF 4.1 获得的 MyType 的 IQueryable。
我通过 linq 以 where 子句的形式应用过滤器,其中一个将根据距给定邮政编码的距离进行过滤。
MyType 有一个 ZipCode 属性,我需要调用一个方法来计算 MyType 邮政编码和我给定的邮政编码之间的距离。
我尝试了以下方法,它可以编译,但在运行时抛出错误。
myTypes = myTypes.Where(x => GetDistance(x.Zip, givenZip) < 10);
我怎样才能做到这一点?
编辑
我的距离方法返回一个双精度数,表示以英里
public double Distance(Position position1, Position position2)
{
}
为单位的距离位置是一个包含纬度和经度双精度数的结构
I have an IQueryable of MyType obtained via EF 4.1.
I am applying filters via linq in the form of a where clause, One of which will filter based on distance from a given zip code.
MyType has a ZipCode property and I need to call a method which computes the distance between the MyType zip codes and my given zip code.
I have tried the following, which compiles, but throws an error at runtime.
myTypes = myTypes.Where(x => GetDistance(x.Zip, givenZip) < 10);
How can I accompish this?
EDIT
My Distance method returns a double that represents the distance in miles
public double Distance(Position position1, Position position2)
{
}
Position is a struct containing doubles for lat and long
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果
GetDistance()
返回一个布尔值,这应该在 Linq to Objects 中起作用 - 它不会在 Linq to Entities 中起作用,因为它会尝试将您的方法映射到 SQL 等效项,当然没有。作为一种粗略的解决方法,您可以使用
AsEnumerable()
但这会具体化您的所有类型,因此如果您的表较大,则不建议这样做:另一种方法是将邮政编码映射到数据库中的地理位置并使用这些位置直接与 很快就会支持空间数据类型 - 在我看来,这可能是最好的方法,但还不能用于生产。当然,如果您仅限于 SQL Server,您可以直接使用存储查询来使用地理位置 - 但这可以绕过 EF。
This should work in Linq to Objects if
GetDistance()
returns a boolean - it will not work with Linq to Entities since it will try to map your method to a SQL equivalent, which of course there is none.As a crude workaround you could use
AsEnumerable()
but that would materialize all your types so is not recommended if your table is larger:Another way would be to map Zip codes to geographic locations in the database and use those locations directly with the soon to be supported spatial data types - this is probably the best approach in my opinion, but not production-ready. Of course if you are restricted to just SQL Server you could just use a store query directly to use geo-locations - but that would work around EF.
这会引发错误,因为运行时会尝试将表达式树转换为 SQL。函数“GetDistance”无法转换。
查看模型定义函数。它们允许您在 edmx 中定义自定义函数,您可以在构建查询时执行该函数。
This will throw an error because the runtime tries to convert your expression tree into SQL. The function 'GetDistance' cannot be converted.
Have a look at Model Defined Functions. They allow you to define a custom function in your edmx which you can execute when building queries.
假设:
尝试:
Assuming:
try: