如何在 IQueryable 对象上调用 LINQ 查询的 where 子句中的方法

发布于 2024-12-11 12:54:56 字数 513 浏览 0 评论 0原文

我有一个通过 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

身边 2024-12-18 12:54:56

如果 GetDistance() 返回一个布尔值,这应该在 Linq to Objects 中起作用 - 它不会在 Linq to Entities 中起作用,因为它会尝试将您的方法映射到 SQL 等效项,当然没有。

作为一种粗略的解决方法,您可以使用 AsEnumerable() 但这会具体化您的所有类型,因此如果您的表较大,则不建议这样做:

myTypes = myTypes.AsEnumerable()
                 .Where(x => GetDistance(x.Zip, givenZip) < 10);

另一种方法是将邮政编码映射到数据库中的地理位置并使用这些位置直接与 很快就会支持空间数据类型 - 在我看来,这可能是最好的方法,但还不能用于生产。当然,如果您仅限于 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:

myTypes = myTypes.AsEnumerable()
                 .Where(x => GetDistance(x.Zip, givenZip) < 10);

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.

我要还你自由 2024-12-18 12:54:56

这会引发错误,因为运行时会尝试将表达式树转换为 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.

终弃我 2024-12-18 12:54:56

假设:

List<myType> myTypes;

尝试:

myTypes = myTypes.Where(x => GetDistance(x.Zip, givenZip) < 10).ToList();

Assuming:

List<myType> myTypes;

try:

myTypes = myTypes.Where(x => GetDistance(x.Zip, givenZip) < 10).ToList();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文