C# 如何在IQueryable对象上的LINQ查询的where子句中调用方法
我有一个通过EF 4.1获得的MyType的IQueryable 我通过linq以where子句的形式应用过滤器,其中一个将根据与给定邮政编码的距离进行过滤 MyType有一个ZipCode属性,我需要调用一个方法来计算MyType邮政编码和给定邮政编码之间的距离 我尝试了以下编译,但在运行时抛出一个错误C# 如何在IQueryable对象上的LINQ查询的where子句中调用方法,c#,.net,linq,entity-framework,entity-framework-4.1,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); Position是一个包含lat和long双精度
myTypes = myTypes.Where(x => GetDistance(x.Zip, givenZip) < 10);
Position是一个包含lat和long双精度的结构,如果
GetDistance()
返回一个布尔值,那么它应该在Linq to对象中工作,因为它将尝试将您的方法映射到SQL等价物,而这当然没有
作为一种粗略的解决方法,您可以使用AsEnumerable()
,但这会具体化您的所有类型,因此如果您的表较大,则不建议使用:
myTypes = myTypes.AsEnumerable()
.Where(x => GetDistance(x.Zip, givenZip) < 10);
myTypes=myTypes.AsEnumerable()
其中(x=>GetDistance(x.Zip,givenZip)<10);
另一种方法是将邮政编码映射到数据库中的地理位置,并直接使用这些位置-在我看来,这可能是最好的方法,但不适合生产。当然,如果您仅限于SQL Server,您可以直接使用存储查询来使用地理位置,但这可以解决EF。这将引发错误,因为运行时试图将表达式树转换为SQL。无法转换函数“GetDistance” 看一看。它们允许您在edmx中定义自定义函数,您可以在生成查询时执行该函数。假设:
List<myType> myTypes;
列出mytype;
尝试:
myTypes=myTypes.Where(x=>GetDistance(x.Zip,givenZip)<10.ToList();
能否与大家分享一下如何实现GetDistance方法,以及在运行时会出现什么错误?这些新支持的空间数据类型的可能副本将在.NET 4.5中得到支持。它们在任何适合生产的版本中都不受支持。谢谢,我刚改为.AsEnumerable(),它解决了我的问题。
List<myType> myTypes;
myTypes = myTypes.Where(x => GetDistance(x.Zip, givenZip) < 10).ToList();