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;
}

しかし、正しくコンパイルできません。var2 番目の の前にa を追加するqueryと、クエリが宣言されていることを確認するプロンプトが表示されます。変数名を変更する必要がありますか? のようなもの:query1 in case1, query2 in case2など。


EDITED 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;
}

2 つのクエリは、2 つの異なるテーブルに対するものです。したがって、IQueryable で Type T を判別する方法がわかりません。また、私selectは を使用した匿名オブジェクトnew { PropertyName = propertyValue }です。私が同じ名前を使用することを主張した場合、とにかくありますqueryか?

4

3 に答える 3

5

with で宣言するとvarコードを短縮できますが、宣言した変数は静的に型指定されたままになり、その変数のスコープは変更されません。

の外部で変数を使用する必要がある場合は、次のようにステートメントのswitch前に宣言します。switch

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

queryの外でも使えるようになりましたswitch

注:var割り当てた型に名前がないために を使用する必要がある場合もありますが、最初のケースでは型に名前があるため、 を使用する必要はありませんvar

EDIT :varただし、匿名型を選択しているため、2 番目のケースでは が必要です。このような状況では、この問題を回避する方法がいくつかあります。

  • 選択した列の「スーパーセット」( TIMETMTEMPERATURE、およびRADIATION)に対して名前付きの型を宣言できます。
  • .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 に答える