переключиться на изменение запроса LINQ

1

Я хотел бы изменить запрос LINQ на основе того, какой productID мы передаем в этот метод, а затем добавить туда и выбрать его после выбора правильного запроса

второй выбор говорит мне, что явное преобразование существует

У меня 3 вопроса

1) почему он заботится о том, что первая оценка будет устанавливать planInfo? Я думаю, если бы я запустил этот код, он бы никогда не устанавливал planInfo в LTDRatesSelected если productID не соответствовал, а второй случай не нуждался в его преобразовании (я надеюсь, что это имеет смысл), поскольку первый оператор case никогда не выполнялся,

2) что я могу сделать, чтобы сделать эту работу, или есть другие способы достижения того же?

3) что я могу сделать, чтобы инициализировать planInfo вне области действия коммутатора? Я бы хотел, чтобы это было анонимно

switch (ProductId)
{
      case (int)Products.LTD:
         var planInfo = from i in context.LTDRatesSelecteds
                        select i;
         break;
      case (int)Products.LADD:
         planInfo = from i in context.LADDRatesSelecteds
                    select i;
         break;
      case (int)Products.STD:
         planInfo = from i in context.STDRatesSelecteds
                    select i;
         break;
      case (int)Products.VoluntaryLife:
         planInfo = from i in context.VoluntaryLifeRatesSelecteds
                    select i;
         break;
      case (int)Products.Dental:
         planInfo = from i in context.DentalRatesSelecteds
                    select i;
         break;
      case (int)Products.Vision:
         planInfo = from i in context.VisionRatesSelecteds
                    select i;
         break;

}
//planInfo.Where(i=> i.PlanCode == "somevalue" && i.Something else == "someothervalue").Select();
  • 0
    var planInfo никогда не будет вызываться для других случаев, поэтому он никогда не определяется вообще. Вы работаете с неопределенной переменной в этих точках.
  • 0
    Какие столбцы вы хотите из таблиц?
Теги:
linq
linq-to-entities

3 ответа

2
Лучший ответ

Вы объявляете переменную planInfo во внутренней области, которая недоступна после этого оператора case.

Чтобы увидеть это ясно, замените свой коммутатор на кучу if..else блоков, и вы увидите следующее:

if (ProductId == (int)Products.LTD)
{
    var planInfo = from i in context.LTDRatesSelecteds
                           select i;
}
else if (ProductId == (int)Products.LADD)
{
    planInfo = from i in context.LADDRatesSelecteds
                           select i;
}

Переключатель эквивалентен приведенному выше коду, и вы ясно увидите, что на втором блоке (блок else) planInfo не существует, он выходит из этой области.

Если вы хотите использовать planInfo после переключения, он должен быть объявлен перед этим коммутатором. Но тогда вы не можете сделать его анонимным, потому что анонимные типы должны быть назначены сразу.

То, что вы можете сделать, - объявить planInfo как IEnumerable (из System.Collections) перед коммутатором, но вам придется отдать его, чтобы сделать, где после переключения:

IEnumerable planInfo;

switch (ProductId)
{
     case (int)Products.LTD:
          planInfo = from i in context.LTDRatesSelecteds
                     select i;
          break;
     case (int)Products.LADD:
          planInfo = from i in context.LADDRatesSelecteds
                     select i;
          break;

     [..]
}

Если вы подробно расскажете о том, чего бы вы хотели достичь, я мог бы помочь больше. Вероятно, идеальным было бы то, что все ваши типы ставок должны наследоваться от общего типа, который содержит их общие свойства, но я не могу подробно описать, как это сделать без дополнительной информации.

  • 0
    это не позволит мне запросить planInfo дальше. Например, после выполнения одного из этих переключателей я беру planInfo и пытаюсь сделать что-то вроде planInfo = planInfo.Where (i => i.something ==thingelse) .Select (i => i); и он жалуется, что IEnumerable не имеет .Where (). У меня есть ссылка на LINQ. Есть идеи?
  • 0
    Я могу ошибаться, но я думаю, что для того, чтобы иметь возможность выполнять запросы с linq, ваш объект должен иметь IEnumerable <T>, поэтому IEnumerable не будет достаточным
Показать ещё 1 комментарий
1

Как я уверен, вы знаете, используя var planInfo = [assignment] ваш planInfo получает свой тип с правой стороны от равных.

Похоже, что в каждом операторе switch "planInfo" представляет другой тип объекта. В вашем первом коммутаторе ваш planInfo присваивается типу (скажем) IEnumerable<LTDRatesSelecteds>

вторая - IEnumerable<LADDRatesSelecteds> - эти два типа не являются взаимозаменяемыми, и он выглядит как ваш planInfo во всем, но первый оператор никогда не инициализируется.

что вы делаете с planInfo после первоначального назначения? Происходит ли такое же поведение в каждой "версии" информации о плане? Если это произойдет, вы, вероятно, можете бросить свои методы в интерфейс и назначить вместо этого "var".

  • 0
    Да, я в основном буду делать то же самое с каждой версией planInfo
  • 0
    + = который выполняет дополнительные запросы
1

одним из способов является объявление переменной каждый раз в случаях, если вам нужно, чтобы она была внешней областью, вы могли бы использовать динамическое ключевое слово для объектов. Вы должны быть очень осторожны, однако с тем, что вы делаете с объектом planInfo после этого, поскольку нет никакой гарантии, и на самом деле есть уверенность в том, что от одного запуска до следующего объект не будет одним и тем же типом данных

dynamic planInfo;
switch (ProductId)
    {
        case (int)Products.LTD:
            planInfo = from i in context.LTDRatesSelecteds
                           select i;
            break;
        case (int)Products.LADD:
            planInfo = from i in context.LADDRatesSelecteds
                       select i;
            break;
        case (int)Products.STD:
            planInfo = from i in context.STDRatesSelecteds
                       select i;
            break;
        case (int)Products.VoluntaryLife:
            planInfo = from i in context.VoluntaryLifeRatesSelecteds
                       select i;
            break;
        case (int)Products.Dental:
            planInfo = from i in context.DentalRatesSelecteds
                       select i;
            break;
        case (int)Products.Vision:
            planInfo = from i in context.VisionRatesSelecteds
                       select i;
            break;

    }
  • 2
    Это сработает, но если вы никогда раньше не работали с динамикой, я бы посоветовал немного почитать об этом, прежде чем углубляться в это, поскольку есть немало недостатков, чтобы согласиться с преимуществами, которые она предоставляет. msdn.microsoft.com/en-us/library/dd264736.aspx

Ещё вопросы

Сообщество Overcoder
Наверх
Меню