2012-05-04 2 views
5

Вот мой запрос:ошибка с Entity Framework .any() фильтр

var x = db 
    .Users 
    .Where(u => u.Locations.Any(l => searchedLocation.Counties.Any(c => c.LocationId == l.LocationId)); 

Контекст:

  • Users является IQueryable<User>. (Набор объектов EF)
  • searchedLocation - Location объект.
  • Counties является ICollection<MiniLocation>.

Что я пытаюсь сделать:

Возвращение всех пользователей, где любой из графств для тех местах, имеют locationId любого из округов, входящих в искомом месте.

Пример:

Поиск в Нью-Йорк (LocationId = 1. County1LocationId = 2)

Пользователь: Bob. Местоположения: Сохо. County1LocationId = 2. County2 LocationId = 3.

Так что это матч. (Потому что Сохо есть графство с LocationId 2, и так же NYC)

Ошибки я получаю:

Невозможно создать постоянное значение «xxx.xxx.Locations.MiniLocation» типа , В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).

Любые идеи?

+0

ли вы попробовать с .join()? –

ответ

1

В этом MSDN page указано, что эта конструкция не поддерживается. Вы можете использовать this method для .Net 3.5 Linq to Entities, чтобы заменить использование Any.

+0

Im on .NET 4. Хорошо, поэтому я понимаю ошибку, но не решение, предложенное в указанной вами ссылке. Какие-либо дополнительные советы/примеры? – RPM1984

0

Вам нужно построить список идентификаторов местоположения, который можно найти.

var idsToSearch = "1,2,3,4,5...";  

Затем вы можете использовать Contains следующим образом:

var x = db 
     .Users 
     .Where(u => idsToSearch.Contains(u.LocationId)); 
+0

Я не думаю, что это правильно. Прежде всего, '.Contains' принимает только' T' или 'IEnumerable '. Во-вторых, это будет соответствовать только тем, где в любом из округов содержится идентификатор местоположения в найденном местоположении, тогда как я хочу, чтобы в каком-либо из графств находилось какое-либо из найденных округов. Сложно, я знаю. :) – RPM1984

+0

Обновлено ........ –

Смежные вопросы