我想实现的是这样的:
switch(flag)
{
case 1:
var query=from w in db.someTable
select w;
break;
case 2:
query=from w in db.someTable
where w.id==someID
select w;
break;
case default:
break;
}
但它无法正确编译。如果我在第二个query
前加上一个var
,它会提示query已经声明。
我必须更改变量名称吗?例如:query1 in case1,query2 in case2
,等等
已编辑 1 感谢您的帮助。事实上,我的代码比我上面发布的要复杂一点。完整代码如下:
List<object> results=new List<object>();
switch (flag)
{
case 1:
var query = from w in db.RADIATION
where w.DATEDT.CompareTo(dateStr) == 0
&& w.LATITUDE.CompareTo(latitude) == 0
&& w.LONGITUDE.CompareTo(longitude) == 0
orderby w.TIMETM
select new { w.RADIATION, w.TIMETM };
break;
case 2:
var query = from w in db.TEMPRETURE
where w.DATEDT.CompareTo(dateStr) == 0
&& w.LATITUDE.CompareTo(latitude) == 0
&& w.LONGITUDE.CompareTo(longitude) == 0
orderby w.TIMETM
select new { w.TEMPRETURE, w.TIMETM };
foreach (var item in query)
{
var resultItem = new { TEMPRETURE = item.TEMPRETURE, TIME = item.TIMETM };
results.Add(resultItem);
}
break;
case default:
break;
}
这两个查询针对的是两个不同的表。所以我不知道如何确定IQueryable中的Type T。此外,我选择
的是一个使用new { PropertyName = propertyValue }
的匿名对象。
无论如何,如果我坚持使用相同的名称query
?
最佳答案
声明 var
让您缩短代码,但您声明的变量保持静态类型,并且该变量的范围不会改变。
如果需要使用switch
之外的变量, 在 switch
之前声明它语句,像这样:
IQueryable<SomeType> query = null;
switch (...) {
case 1: query = ...; break;
...
default: ...
}
现在您可以使用 query
外面switch
.
注意:有些情况下您必须使用 var
因为您分配给它的类型没有名称,但在您的第一种情况下,该类型有一个名称,因此您不需要使用 var
.
编辑: 但是,您的第二个案例确实需要 var
,因为您选择的是匿名类型。在这种情况下,有几种方法可以解决此问题:
- 您可以为所选列的“超集”声明命名类型(即
TIMETM
、TEMPERATURE
和RADIATION
),或者 - 在 .NET 4.0 中,您可以使用
IQueryable<dynamic>
.这将一些编译时检查转移到运行时,但如果您必须走这条路,那将非常方便。
关于c# - 如何在 C# 中重用 "var"声明的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17416488/