Как вызвать метод в предложении where запроса LINQ для объекта IQueryable - PullRequest
4 голосов
/ 25 октября 2011

У меня есть IQueryable из MyType, полученный через EF 4.1.

Я применяю фильтры через linq в форме предложения where, один из которых будет фильтровать на основе расстояния от данного почтового индекса.

MyType имеет свойство ZipCode, и мне нужно вызвать метод, который вычисляет расстояние между почтовыми индексами MyType и моим заданным почтовым индексом.

Я попробовал следующее, которое компилируется, но выдает ошибку во время выполнения.

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

Как мне это сделать?

РЕДАКТИРОВАТЬ

Метод My Distance возвращает значение типа double, представляющее расстояние в милях

public double Distance(Position position1, Position position2)
{ 

}

Position - структура, содержащая значения типа double для long и long

Ответы [ 3 ]

7 голосов
/ 25 октября 2011

Это должно работать в Linq to Objects, если GetDistance() возвращает логическое значение - он не будет работать с Linq to Entities, поскольку попытается сопоставить ваш метод с эквивалентом SQL, которого, конечно, нет.

В качестве грубого обходного пути вы можете использовать AsEnumerable(), но это материализует все ваши типы, поэтому не рекомендуется, если ваш стол больше:

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

Другим способом было бы сопоставить почтовые индексы с географическими местоположениями в базе данных и использовать эти местоположения непосредственно с , который скоро будет поддерживаться пространственными типами данных - это, вероятно, лучший подход, на мой взгляд, но не производство готовых. Конечно, если вы ограничены только SQL Server, вы можете просто использовать запрос хранилища напрямую, чтобы использовать географические местоположения, но это будет работать в обход EF.

2 голосов
/ 25 октября 2011

Это вызовет ошибку, потому что среда выполнения пытается преобразовать ваше дерево выражений в SQL.Функция 'GetDistance' не может быть преобразована.

Посмотрите на Определенные моделью функции .Они позволяют вам определять пользовательскую функцию в вашем edmx, которую вы можете выполнять при построении запросов.

0 голосов
/ 25 октября 2011

Предполагается:

List<myType> myTypes;

попытаться:

myTypes = myTypes.Where(x => GetDistance(x.Zip, givenZip) < 10).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...