EFCore 2.2 Не найдено сопоставление с реляционным типом для типа CLR «Выражение []» - PullRequest
2 голосов
/ 28 февраля 2020

У меня есть проект, который использовал DBML в качестве ORM для получения данных из нашей базы данных. Мы находимся в процессе замены этого DBML на Entity Framework Core 2.2.6 (к сожалению, самая последняя версия, которую мы можем использовать, поскольку мы должны поддерживать старый. Net 4 кода платформы).

У меня есть блок LINQ, который работал с использованием старого кода DBML, но не работает в платформе EF Core 2.2.6. Я получаю сообщение об ошибке:

Невозможно найти сопоставление с реляционным типом для типа CLR 'Expression []'.

  List<datadictproperty> dprop = (from dd in dBConnection.datadictproperties
                                  where
                                    dd.entityid == ent.id &&
                                    dd.clientid == clientid &&
                                    ((((dd.suppress <= emp.seclevel &&
                                        dd.suppress != Constants.g_everyone_seclevel) ||
                                       dd.suppress == null)) || ignoreSecLevel) ||
                                    (!
                                      (from d in dBConnection.datadictproperties
                                       where
                                       d.entityid == ent.id &&
                                       d.clientid == clientid &&
                                       d.name == dd.name
                                       select new
                                       {
                                         d.name
                                       }).Contains(new { dd.name }) &&
                                     dd.entityid == ent.id &&
                                     dd.clientid == null &&
                                     ((((dd.suppress <= emp.seclevel &&
                                         dd.suppress != Constants.g_everyone_seclevel) ||
                                        dd.suppress == null)) || ignoreSecLevel))
                                  orderby
                                    dd.name
                                  select dd).ToList();

One Я могу добавить, что это может упростить то, что следующий оператор должен возвращать ноль или одну строку, так что FirstOrDefault () может работать. На данный момент он возвращает анонимный тип List<T>.

(from d in dBConnection.datadictproperties where
    d.entityid == ent.id &&
    d.clientid == clientid &&
    d.name == dd.name
        select new
        {
          d.name
        })

Часть утверждения, которое, по моему мнению, не работает, заключается в следующем:

d.name == dd.name
select new
{
  d.name
}).Contains(new { dd.name })

Моя проблема заключается в том, что Я не могу понять, как изменить этот код, чтобы правильно получать те же данные, используя технологию EF Core 2.2.6.

Есть ли кто-нибудь, кто мог бы дать мне несколько идей относительно того, как я могу изменить этот код для создания те же данные и, следовательно, не генерировать ошибку времени выполнения, упомянутую выше?

Любая помощь будет принята с благодарностью:)

1 Ответ

0 голосов
/ 28 февраля 2020

Я понял, как исправить этот код. Конечным результатом было использование следующего кода:

List<datadictproperty> dprop = dBConnection.datadictproperties.Where(
                                    dd =>
                                      dd.entityid == ent.id &&
                                      dd.clientid == clientid &&
                                      ((((dd.suppress <= emp.seclevel &&
                                            dd.suppress != Constants.g_everyone_seclevel) ||
                                            dd.suppress == null)) || ignoreSecLevel) ||
                                        (!(dBConnection.datadictproperties.Where(d =>
                                            d.entityid == ent.id &&
                                            d.clientid == clientid &&
                                            d.name == dd.name).Select(d => d.name)).Contains(dd.name) &&
                                            dd.entityid == ent.id &&
                                            dd.clientid == null &&
                                            (((dd.suppress <= emp.seclevel &&
                                                dd.suppress != Constants.g_everyone_seclevel) ||
                                            dd.suppress == null) || ignoreSecLevel))
                                    ).OrderBy(dd => dd.name).ToList();

Кажется, что изменение его на следующее сработало. Я предполагаю, потому что это не анонимный тип после выбора.

(dBConnection.datadictproperties.Where(d =>
                                            d.entityid == ent.id &&
                                            d.clientid == clientid &&
                                            d.name == dd.name).Select(d => d.name))
...