我想要实现的是:
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
之前添加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.另外,我select
是使用new { PropertyName = propertyValue }
的匿名对象。
如果我坚持使用相同的名字query
?
答案 0 :(得分:5)
使用var
声明可以缩短代码,但是您声明的变量仍然是静态类型的,并且该变量的范围不会改变。
如果您需要在switch
之外使用变量,请在switch
语句之前声明它,如下所示:
IQueryable<SomeType> query = null;
switch (...) {
case 1: query = ...; break;
...
default: ...
}
现在,您可以在query
之外使用switch
。
注意:在某些情况下您必须使用var
,因为您为其分配的类型没有名称,但在第一种情况下,类型具有名称,因此您不需要使用{{1 }}
编辑但是,您的第二种情况确实需要var
,因为您选择的是匿名类型。在这种情况下,有几种方法可以解决这个问题:
var
,TIMETM
和TEMPERATURE
),或RADIATION
。这会将一些编译时检查转移到运行时,但如果你必须走这条路,那就非常方便了。答案 1 :(得分:3)
var
关键字无关紧要。你可以这样做:
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;
}
这是正确的语法,但我建议您将每个案例提取到每个方法。
答案 2 :(得分:0)
如果它是同一个表,你可以试试这个:
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;
}