切换以更改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();
您在内部作用域中声明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;
}