Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在IQueryable对象上的LINQ查询的where子句中调用方法_C#_.net_Linq_Entity Framework_Entity Framework 4.1 - Fatal编程技术网

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

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双精度

我有一个通过EF 4.1获得的MyType的IQueryable

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

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

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

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();