Линк к сущностям над EF 4 на SQL Server 2005 - PullRequest
4 голосов
/ 22 февраля 2011

'Невозможно сравнить элементы типа' System.Collections.Generic.ICollection`1 '.Поддерживаются только примитивные типы (такие как Int32, String и Guid) и типы сущностей. '

Сущности и отношения (свойства навигации):

Case (1 <-> ∞) MeetingCase (1 <-> ∞) MeetingCaseOutcomes

Код ошибки:

IQueryable<Case> cases; // this is obviously attached to a context and able to access data)
var broken = cases
   .Where(c => c.MeetingCases
      .Where(mc => mc.ExpectedStartDateTime <= DateTime.Now)
         .Any(m => m.MeetingCaseOutcomes == null || m.MeetingCaseOutcomes.Count == 0));

Я предполагаю, что проблема связана с отсутствием поддержки оператора «Любой», хотя я думал, что это будет работать в EF 4 (поскольку добавлена ​​поддержка связанного оператора «Содержит»)).

Как мне реструктурировать этот вызов, чтобы получить то, что я хочу?

Я работаю с EF уже несколько месяцев и понимаю, что многие ошибки во время выполнения

ОБНОВЛЕНИЕ:

Приведенное выше условие Where содержит предикат, как показано ниже:

c.MeetingCases.Where(mc => mc.ExpectedStartDateTime <= DateTime.Now)
              .Any(m => m.MeetingCaseOutcomes == null || m.MeetingCaseOutcomes.Count == 0)

Поскольку Any возвращает логическое значение, все это создает предикатexpression.

Кроме того, целью этой логики является возвращение набора объектов Case, у которых нет записей MeetingCaseOutcome для любых записей MeetingCase, где собрание уже состоялось (отсюда сравнениеn до DateTime.Now).Это является частью системы планирования собраний, и это необходимо для проверки того, что результаты каждого собрания вводятся в систему после проведения собрания.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

EF 1 и EF 4 поддерживают .Any(). Проблема в том, что вы недостаточно используете его. :)

IQueryable<Case> cases; // this is obviously attached to a context and able to access data)
var broken = cases
   .Where(c => c.MeetingCases
                .Where(mc => mc.ExpectedStartDateTime <= DateTime.Now)
                .Any(m => !m.MeetingCaseOutcomes.Any()));
1 голос
/ 22 февраля 2011

Эта часть проблемы:

Where(c => c.MeetingCases
      .Where..

.Where требует Expression<Func<T,bool>>, другими словами, предикат, который возвращает истину / ложь. Но вы предоставляете ему предикат, который возвращает последовательность элементов.

Я думаю, что второе .Where необходимо изменить на .Any или .All.

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

Итак, ваш запрос должен быть:

var cases = cases
   .Where(case => case.MeetingCases
      .Any(caseMeeting => caseMeeting.ExpectedStartDateTime <= DateTime.Now));

Я не уверен, что вы пытаетесь сделать с этим последним .Any предложением.

Также - не забывайте о проблемах загрузки / проецирования. Вы говорите «он привязан к контексту», и это нормально, но c.MeetingCases ничего не вернет, если вы не загружаетесь лениво или не хотите загружаться заранее.

...