C# 如何重用C中由“var”声明的变量
我想要实现的是:C# 如何重用C中由“var”声明的变量,c#,linq,var,C#,Linq,Var,我想要实现的是: 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;
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;
}
但它不能正确编译。如果在第二个查询之前添加一个var,它会提示已经声明了该查询。
我必须更改变量名吗?例如:案例1中的查询1,案例2中的查询2,等等
编辑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中的类型t。另外,我选择的是一个使用新{PropertyName=propertyValue}的匿名对象。
如果我坚持使用相同名称的查询,还有其他方法吗?使用var声明可以缩短代码,但是声明的变量仍然是静态类型的,并且该变量的范围不会更改
如果需要在switch之外使用变量,请在switch语句之前声明它,如下所示:
IQueryable<SomeType> query = null;
switch (...) {
case 1: query = ...; break;
...
default: ...
}
switch(flag)
{
case 1: {
var query=from w in db.someTable
select w;
}
break;
case 2: {
var query=from w in db.someTable
where w.id==someID
select w;
}
break;
default:
break;
}
现在,您可以在交换机外部使用查询
注意:在某些情况下,您必须使用var,因为您分配给它的类型没有名称,但在第一种情况下,类型有名称,因此您不需要使用var
编辑:但是,您的第二个案例确实需要一个var,因为您选择的是匿名类型。在这种情况下,有几种方法可以解决此问题:
您可以为所选列的超集(即TIMETM、TEMPERATURE和Radio)声明命名类型,或
在.NET4.0中,可以使用IQueryable。这会将一些编译时检查转移到运行时,但如果必须这样做,则非常方便。
如果是同一张表,您可以尝试以下操作:
var query=from w in db.someTable select w;
switch(flag)
{
case 1:
break;
case 2:
query=query.Where(w.id==someID);
break;
default:
query=null; //since linq is Delay query, if you don't use the data in query, it will do nothing.
break;
}
var关键字是不相关的。您可以这样做:
IQueryable<SomeType> query = null;
switch (...) {
case 1: query = ...; break;
...
default: ...
}
switch(flag)
{
case 1: {
var query=from w in db.someTable
select w;
}
break;
case 2: {
var query=from w in db.someTable
where w.id==someID
select w;
}
break;
default:
break;
}
这是正确的语法,但我建议您将每个case提取到每个方法。您必须定义类型,然后在切换之前声明它。您想在切换之后使用query吗?@tia不,我不想。我知道这似乎有点不合理,但我只想使用相同名称的查询,因为它们都是表的查询。为什么不定义一个类作为查询结果?如:列表结果=新列表;然后选择new MyClass{}@AmareKnight查看我的答案。@Jason由于延迟执行,行为将显示相同,但代码不会像OP的代码那样清晰地传达这一点。默认情况下,set query=null:D@Tim.Tang如果你这样做了,你就不能再使用var了。这与@dasblinkenlight answer相同为什么不将类定义为查询结果?如:列表结果=新列表;然后结果=。。。。。选择新的MyClass{};谢谢你的帮助。我已经编辑了我的问题,请阅读。如果我理解正确,查询投影会根据开关而不同吗?你不能那样做。var仍然被编译为一种类型,它只是编译器在可以推断变量类型时提供的语法糖,这就是为什么var=null不能被执行的原因,因为它适用于任何对象。第一个和第二个开关选择两个不同的匿名对象,因此选择两种不同的对象类型。不能将两个变量都赋给一个变量。Thx!现在我对var的理解好多了。稍后我会尝试动态方法。酷,就是大括号。非常感谢。