75

オプションのパラメーターをクエリから削除する必要がある場合は、Linq クエリにオプションのパラメーターを含めるか、IF などの変数にクエリを割り当てることができる必要があります。

IF ステートメント内にクエリ var を設定すると、ループしようとすると、var がコンテキスト内に存在しないことがわかります。

if (whichGroup == "All")
        {
            var listOppLineData = (from o in db.opportunity_vws
                                   where o.fiscal_yr_and_qtr == qtr
                                   select o
                                  );
        }
        else
        {
            var listOppLineData = (from o in db.opportunity_vws
                                   where o.fiscal_yr_and_qtr == qtr && o.Group == whichGroup
                                   select o
                                  );
        }

        foreach (var data in listOppLineData)  //listOppLineData doesn't exist here
        {

IF ステートメントの前に var を設定する必要があると思いますが、何を設定すればよいかわかりません。

var listOppLineData = ""; // gives me 
Cannot implicitly convert type 'System.Linq.IQueryable<Forecast.Models.opportunity_vw>' to 'string'

IQueryable listOppLineData = new IQueryable(); //gives me
        Cannot create an instance of the abstract class or interface 'System.Linq.IQueryable'
4

6 に答える 6

217

これを試して。Tを使用してジェネリック型を作成することも、Tを型名に置き換えることで特定の型を作成することもできます。

IQueryable listOppLineData = Enumerable.Empty<T>().AsQueryable()
于 2015-04-03T10:52:43.987 に答える
32

これを試して:

IQueryable<opportunity_vw> listOppLineData;

これは変数を定義していますが、初期化するのを待っています。

また、クエリを見ると、次のようにすべてを1つで行うことができます。

var listOppLineData = (from o in db.opportunity_vws
                      where o.fiscal_yr_and_qtr == qtr && (o.Group == whichGroup || whichGroup == "All")
                      select o
                      );
于 2013-02-21T01:31:04.657 に答える
7

問題は、C#で変数を宣言するときに、現在のスコープでのみ宣言することです。したがって、ブロック内で変数を宣言すると、listOppLineDataそのifブロック内でのみ使用でき、他の場所では使用できません。(別のブロックで同じ名前の別の変数を定義できますが、それは完全に異なる変数になるため、最初の変数に割り当てた値はありません。)

ifすでに理解しているように、ブロックの外側で変数を宣言する必要があります。

コンパイラーは、変数のタイプを明示的に指定していないことを認識し(それがvar機能する)、変数にを割り当てたため、最初の試みは機能しませんでしstringた。したがって、変数の型はであると推測されますstringstringそして、そのような変数にではないものを割り当てることはできません。

インターフェイスのインスタンスを作成できないため、2回目の試行は機能しませんでした。(インスタンスを作成する場合は、特定のタイプ(通常はクラス)である必要があります。)そして、それを修正しても、非ジェネリックIQueryableはその中のアイテムのタイプを認識しないため、機能しませんforeach。良い。

ただし、変数はの両方のブランチに割り当てられているため、変数に値を割り当てる必要はありませんif。そして、ここでの正しいタイプは、であるIQueryable<T>ジェネリックTですopportunity_vw。つまり、正しいコードは次のとおりです。

IQueryable<opportunity_vw> listOppLineData;

if (whichGroup == "All")
{
    listOppLineData = …;
}
else
{
    listOppLineData = …;
}

foreach (var data in listOppLineData)
{
    …
}

本当に変数に値を割り当てたい場合(ここでそれを行う理由はありませんが)、次を使用できますnull(値がないことを表します)。

IQueryable<opportunity_vw> listOppLineData = null;
于 2013-02-21T02:14:39.287 に答える
-1

.ToList(); を追加してみてください。

var listOppLineData = (from o in db.opportunity_vws
                                   where o.fiscal_yr_and_qtr == qtr
                                   select o
                                  ).ToList();

アップデート

そして、クエリを修正します。

.ToList(); がなければ、反復するものは何もありません。

ヘッド アウト オブ バット アップデート

var listOppLineData = (from o in db.opportunity_vws
                      where (whichGroup == "All" || o.Group == whichGroup)
                      && (o.fiscal_yr_and_qtr == qtr)
                      select o);

OR の前に「短い」を配置すると、2 番目の部分が必要でない場合は評価されません。私はまだ .ToList() を使用します。

于 2013-02-21T01:29:24.203 に答える
-1

次のような宣言を使用できます。

var listOppLineData = (object)null;

次に、その変数を次のように使用します。

listOppLineData = (from o in db.opportunity_vws
    where o.fiscal_yr_and_qtr == qtr && (o.Group == whichGroup || whichGroup == "All")
    select o
);
于 2021-09-25T10:09:14.343 に答える