2

我想要实现的是:

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

4

3 回答 3

5

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

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

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

现在您可以queryswitch.

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

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

  • 您可以为您选择的列的“超集”(即 、 和 )声明一个命名TIMETM类型TEMPERATURERADIATION或者
  • 在 .NET 4.0 中,您可以使用IQueryable<dynamic>. 这将一些编译时检查转移到运行时,但如果你必须走这条路,它非常方便。
于 2013-07-02T02:32:38.390 回答
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;
}

这是正确的语法,但我建议您将每个案例提取到每个方法中。

于 2013-07-02T04:16:33.840 回答
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;
}
于 2013-07-02T02:33:45.647 回答