Я хотел бы изменить запрос 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();
Вы объявляете переменную 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;
[..]
}
Если вы подробно расскажете о том, чего бы вы хотели достичь, я мог бы помочь больше. Вероятно, идеальным было бы то, что все ваши типы ставок должны наследоваться от общего типа, который содержит их общие свойства, но я не могу подробно описать, как это сделать без дополнительной информации.
Как я уверен, вы знаете, используя var planInfo = [assignment]
ваш planInfo получает свой тип с правой стороны от равных.
Похоже, что в каждом операторе switch "planInfo" представляет другой тип объекта. В вашем первом коммутаторе ваш planInfo присваивается типу (скажем) IEnumerable<LTDRatesSelecteds>
вторая - IEnumerable<LADDRatesSelecteds>
- эти два типа не являются взаимозаменяемыми, и он выглядит как ваш planInfo во всем, но первый оператор никогда не инициализируется.
что вы делаете с planInfo после первоначального назначения? Происходит ли такое же поведение в каждой "версии" информации о плане? Если это произойдет, вы, вероятно, можете бросить свои методы в интерфейс и назначить вместо этого "var".
одним из способов является объявление переменной каждый раз в случаях, если вам нужно, чтобы она была внешней областью, вы могли бы использовать динамическое ключевое слово для объектов. Вы должны быть очень осторожны, однако с тем, что вы делаете с объектом 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;
}
var planInfo
никогда не будет вызываться для других случаев, поэтому он никогда не определяется вообще. Вы работаете с неопределенной переменной в этих точках.