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

标签 c# .net linq entity-framework entity-framework-4.1

我有一个通过 EF 4.1 获得的 MyType 的 IQueryable。

我通过 linq 以 where 子句的形式应用过滤器,其中一个将根据与给定邮政编码的距离进行过滤。

MyType 有一个 ZipCode 属性,我需要调用一个方法来计算 MyType 邮政编码和我给定的邮政编码之间的距离。

我已经尝试了以下方法,它可以编译,但会在运行时抛出错误。

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

我怎样才能做到这一点?

编辑

我的 Distance 方法返回一个 double 值,表示以英里为单位的距离

public double Distance(Position position1, Position position2)
{ 

}

Position 是一个包含 lat 和 long 的 double 结构

最佳答案

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

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

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

另一种方法是将邮政编码映射到数据库中的地理位置,并直接将这些位置与 soon to be supported spatial data types 一起使用- 在我看来,这可能是最好的方法,但还不能用于生产。当然,如果您仅限于 SQL Server,您可以直接使用商店查询来使用地理位置 - 但这可以解决 EF。

关于c# - 如何在 IQueryable 对象的 LINQ 查询的 where 子句中调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7889256/

相关文章:

c# - 在 C# 中解析文本文件并跳过一些内容

c# - 很难弄清楚 (uint8_t const * const *) 在 .Net 术语中的含义

.net - 使 WrapPanel 尊重他 parent 的宽度

c# - 将 LINQ 查询缩小到一列

c# - 在 Linq 中获取一个值的总和

c# - 可访问性不一致 : parameter type for generic c# interface

c# - 使用列表时如何在 foreach 中使用 CheckBoxFor?

.net - InstallShield 2012 - 使用 Microsoft Visual C++ 2012 Redistributable 部署应用程序?

c# - 最小起订量返回未被调用

c# - 如何为 Linq-To-Entities 应用动态过滤器并在服务器端执行它们