LINQ to Entities не возвращает ожидаемый результат

Я использую представление для возврата сложного поискового запроса. Когда я использую linq для запроса к EF, он возвращает одну и ту же строку 3 раза (фактическое количество строк верно).

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

ReadmitPatientList
    .AsQueryable()
    .Where("PatientLastName.StartsWith(\"cooper\")")
    .OrderBy (rpl => rpl.PatientLastName)
    .Dump();

Это linq, который я использую для обоих.

linqpad показывает лямбду следующим образом: EF:

ReadmitPatientList.MergeAs (AppendOnly)
   .Where ( => .PatientLastName.StartsWith ("cooper"))
   .OrderBy (rpl => rpl.PatientLastName)

DB

ReadmitPatientList
   .Where ( => .PatientLastName.StartsWith ("cooper"))
   .OrderBy (rpl => rpl.PatientLastName)

Я не могу опубликовать результаты... но EF возвращает три строки одной и той же записи. БД возвращает 3 строки отдельных записей. Как и мой sql-запрос.

Что нужно изменить в моем EF LINQ, чтобы он работал правильно?


Код sql, сгенерированный запросом EF Linq, фактически возвращает правильные результаты, если выполняется в проводнике SQL.


person ecathell    schedule 20.05.2011    source источник
comment
Я не уверен, что понимаю. Является ли количество строк правильным, как в 3 или 1? Вы можете попробовать .Where(it.PatientLastName LIKE 'cooper%').   -  person Fabian Nicollier    schedule 21.05.2011
comment
количество строк должно быть 3 уникальными записями для одного и того же человека. (т.е. три разных посещения) запрос EF возвращает одну и ту же запись 3 раза. прямой запрос БД возвращается правильно   -  person ecathell    schedule 21.05.2011
comment
@ours Я пробовал так с тем же результатом против EF, это не сработало против Straight DB.   -  person ecathell    schedule 21.05.2011


Ответы (1)


Это происходит, если сущность «Пациент» не имеет первичного ключа или столбцы, выведенные как первичный ключ, одинаковы для нескольких записей в наборе результатов. EF использует внутреннюю карту идентификации, которая требует, чтобы каждая уникально идентифицированная запись повторно использовала один и тот же экземпляр сущности. Поэтому, если вы вернете три записи из базы данных, которые имеют одинаковую уникальную идентификацию, для EF будет возвращено перечисление трех одинаковых экземпляров, представляющих первую запись из набора результатов (подробнее о карте идентификации также здесь). Такое же поведение наблюдается в DataContext Linq-to-sql.

person Ladislav Mrnka    schedule 21.05.2011
comment
GAH... вы знаете что, я думаю, что я ДЕЙСТВИТЕЛЬНО добавил ключевой атрибут в поле ROWID... позвольте мне попробовать это и вернуться к вам. - person ecathell; 21.05.2011
comment
ok добавление атрибута ключа к свойству RowID не сработало. RowID — это GUID, поэтому он будет уникальным. Как мне это исправить, так как я использую представление, я предполагаю, что даже у sproc будет эта проблема. - person ecathell; 21.05.2011
comment
эм... просто чтобы уточнить, я добавил ключ в свой файл метаданных DomainService. Что я не знаю, как использовать linq, но мое приложение по-прежнему показывает то же поведение после перекомпиляции. - person ecathell; 21.05.2011
comment
хорошо, на моей диаграмме модели я вижу, что она сделала вывод, что идентификатор пациента является ключевым значением, что неверно. - person ecathell; 21.05.2011
comment
Я думаю, что нашел, как это исправить, я отредактировал объект в edmx и изменил предполагаемый ключ на идентификатор строки, который я хотел сейчас протестировать. - person ecathell; 21.05.2011
comment
Это помогло мне узнать, что я поместил ключевой атрибут в неправильное свойство. Спасибо. - person Maheep; 16.01.2016