. Где в списке выдается ошибка при использовании типов Dynami c в 2sxc - PullRequest
1 голос
/ 24 февраля 2020

У меня есть этот рабочий код:

@{
      var ekgList = AsList(App.Data["Ekgs"]);
      foreach(var ekg in ekgList) {
          <div>
              @foreach (var entitiesFromSinusDataType in ekg.Sinus) {
                  if(entitiesFromSinusDataType.EntityId == Content.EntityId) {
                      <a>@ekg.ShortName</a>
                  }
              }
          </div>
     }
}

Для того, что я могу понять:

  • ekgList - это список (стандартный 2sx c код для доступа к данным)
  • ekg.Sinus - это поле в типе контента Ekgs (тип данных Entity, множественный, который создает список объектов из другого типа контента, Sinus)
  • Content.EntityId - это int, так же, как entityFromSinusDataType.EntityId

Должен быть простой способ удалить второе l oop и "if", поместив предложение where в первое l oop. Я пробую это шаг за шагом, но как только я попробую это:

@{
      var ekgList = AsList(App.Data["Ekgs"]);
      foreach(var ekg in ekgList) {
          <div>
              @foreach (var entitiesFromSinusDataType in ekg.Sinus.Where(i => i.EntityId == Content.EntityId)) {
                  <a>@ekg.ShortName</a>
              }
          </div>
     }
}

Я получаю эту ошибку:

CS1977: Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type

Это, кажется, вызвано использованием Dynami c types.

Есть ли способ привести списки в не динамическую c их версию?

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Это потому, что компилятор не может угадать, что ekg.Sinus является списком - поэтому расширения LINQ не разрешаются автоматически. Обратите внимание, что вы также можете сделать это, так как 2sx c 10.25:

AsList(ekg.Sinus).Where(...)

или в случае, если это не работает (опять-таки, иногда компилятор не может угадать все):

AsList(ekg.Sinus as object).Where(...)

Я также предлагаю вам ознакомиться с руководствами по LINQ https://2sxc.org/dnn-tutorials/en/razor/linq/home

1 голос
/ 24 февраля 2020

Попробуйте привести ekg.Sinus к ((IEnumerable<dynamic>)ekg.Sinus):

((IEnumerable<dynamic>)ekg.Sinus).Where(i => i.EntityId == Content.EntityId)

Надеюсь, это поможет вам.

...