web-dev-qa-db-ja.com

Linq to SQLで使用するために空のIQueryableをインスタンス化する

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'
44
user2073077

これを試して:

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
                      );
19
Simon C

これを試して。 [〜#〜] t [〜#〜]でジェネリック型を作成するか、または[〜#〜] t [〜#〜]で置き換えて特定の型を作成できます。あなたのタイプ名。

IQueryable listOppLineData = Enumerable.Empty<T>().AsQueryable()
124
Krishna

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

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

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

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

ただし、変数はifの両方のブランチに割り当てられるため、変数に値を割り当てる必要はありません。そして、ここでの正しい型は一般的なIQueryable<T>Topportunity_vw。つまり、正しいコードは次のとおりです。

IQueryable<opportunity_vw> listOppLineData;

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

foreach (var data in listOppLineData)
{
    …
}

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

IQueryable<opportunity_vw> listOppLineData = null;
5
svick

わたしにはできる:

IQueryable<string> _labTests = Enumerable.Empty<string>().AsQueryable();
2
agileDev

.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()を使用します。

0
Trey Gramann