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

ste*_*776 4 .net c# linq entity-framework entity-framework-4.1

我通过EF 4.1获得了MyType的IQIery.

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

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

我尝试了以下编译,但在运行时抛出错误.

myTypes = myTypes.Where(x => GetDistance(x.Zip, givenZip) < 10);
Run Code Online (Sandbox Code Playgroud)

我该怎么做到这一点?

编辑

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

public double Distance(Position position1, Position position2)
{ 

}
Run Code Online (Sandbox Code Playgroud)

Position是一个结构,包含lat和long的双精度数

Bro*_*ass 7

这应该在Linq to Objects中工作,如果GetDistance()返回一个布尔值 - 它不能用于Linq到实体,因为它会尝试将你的方法映射到SQL等价物,当然没有.

作为一种原始的解决方法,您可以使用,AsEnumerable()但这将实现您的所有类型,因此如果您的表更大,不建议使用:

myTypes = myTypes.AsEnumerable()
                 .Where(x => GetDistance(x.Zip, givenZip) < 10);
Run Code Online (Sandbox Code Playgroud)

另一种方法是将Zip代码映射到数据库中的地理位置,并将这些位置直接与即将支持的空间数据类型一起使用 - 这可能是我认为最好的方法,但不是生产就绪的.当然,如果您仅限于SQL Server,您可以直接使用商店查询来使用地理位置 - 但这可以解决EF问题.