Linqクエリにオプションパラメータを含めるか、そのオプションパラメータをクエリから削除する必要がある場合、IFなどの変数にクエリを割り当てることができる必要があります。
IFステートメント内にクエリ変数を設定すると、ループを実行しようとしたときにコンテキストに変数が存在しないことがわかります。
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'
これを試して:
IQueryable<opportunity_vw> listOppLineData;
これは変数を定義していますが、それを初期化するのを待っています。
また、クエリを見ると、次のようにすべてを実行できます。
var listOppLineData = (from o in db.opportunity_vws
where o.fiscal_yr_and_qtr == qtr && (o.Group == whichGroup || whichGroup == "All")
select o
);
これを試して。 [〜#〜] t [〜#〜]でジェネリック型を作成するか、または[〜#〜] t [〜#〜]で置き換えて特定の型を作成できます。あなたのタイプ名。
IQueryable listOppLineData = Enumerable.Empty<T>().AsQueryable()
あなたの問題は、C#で変数を宣言するとき、現在のスコープでのみ宣言することです。したがって、listOppLineData
ブロックで変数if
を宣言すると、そのブロック内でのみ使用できますが、他の場所では使用できません。 (別のブロックで同じ名前の別の変数を定義できますが、それは完全に異なる変数になるため、最初の変数に割り当てた値はありません。)
既に理解したように、if
ブロックの外側で変数を宣言する必要があります。
コンパイラは、変数の型を明示的に指定しなかった(var
が行うこと)ことをコンパイラが認識し、string
を変数に割り当てたため、最初の試みは機能しませんでした。そのため、変数の型はstring
であると推測されました。そして、string
以外のものをそのような変数に割り当てることはできません。
インターフェイスのインスタンスを作成できないため、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;
わたしにはできる:
IQueryable<string> _labTests = Enumerable.Empty<string>().AsQueryable();
.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()を使用します。