Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重用C中由“var”声明的变量_C#_Linq_Var - Fatal编程技术网

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的理解好多了。稍后我会尝试动态方法。酷,就是大括号。非常感谢。