我通过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
双精度的结构答案 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();