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

时间:2011-10-25 12:29:16

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

我通过EF 4.1获得了MyType的IQI。

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

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

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

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

我怎么能这样做?

修改

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

public double Distance(Position position1, Position position2)
{ 

}

Position是一个包含lat和long

双精度的结构

3 个答案:

答案 0 :(得分:6)

如果GetDistance()返回一个布尔值,这应该在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。

答案 1 :(得分:1)

这会抛出错误,因为运行时会尝试将表达式树转换为SQL。无法转换函数'GetDistance'。

看看Model Defined Functions。它们允许您在edmx中定义自定义函数,您可以在构建查询时执行该函数。

答案 2 :(得分:0)

假设:

List<myType> myTypes;

尝试:

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