切换以更改LINQ查询

本文关键字:LINQ 查询 | 更新日期: 2023-09-27 18:25:45

我想根据我们传递给该方法的productID来更改LINQ查询,然后在选择正确的查询后添加where和select

第二个选择告诉我存在显式转换

我有3个问题

1) 为什么它关心第一次评估会将planInfo设置为什么?我在想,如果我运行这段代码,如果productID不匹配,就永远不会将planInfo设置为LTDRatesSelected,并且第二个case不应该需要转换(我希望我有道理),因为第一个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();

切换以更改LINQ查询

您在内部作用域中声明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;
}

开关相当于上面的代码,你会清楚地看到,在第二个区块(其他区块)上,planInfo不存在,它超出了这个范围。

如果要在切换之后使用planInfo,则必须在切换之前声明它。但是,您不能将其作为匿名类型,因为必须立即分配匿名类型。

您可以做的是在切换之前将planInfo声明为IEnumerable(来自System.Collections),但您必须将其强制转换为切换后的where:

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"。

一种方法是每次在这种情况下声明变量,如果您需要它是一个外部作用域,则可以为对象使用dynamic关键字。然而,在那之后,你需要非常小心地处理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;
    }