如何在C#中重用“var”声明的变量

时间:2013-07-02 02:28:02

标签: 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;
          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

,是否有

3 个答案:

答案 0 :(得分:5)

使用var声明可以缩短代码,但是您声明的变量仍然是静态类型的,并且该变量的范围不会改变。

如果您需要在switch之外使用变量,请在switch语句之前声明它,如下所示:

IQueryable<SomeType> query = null;
switch (...) {
    case 1: query = ...; break;
    ...
    default: ...
}

现在,您可以在query之外使用switch

注意:在某些情况下您必须使用var,因为您为其分配的类型没有名称,但在第一种情况下,类型具有名称,因此您不需要使用{{1 }}

编辑但是,您的第二种情况确实需要var,因为您选择的是匿名类型。在这种情况下,有几种方法可以解决这个问题:

  • 您可以为所选列的“超集”声明命名类型(例如varTIMETMTEMPERATURE),或
  • 在.NET 4.0中,您可以使用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;
}