我有一个通过 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/