簡體   English   中英

"實例化空 IQueryable 以用於 Linq to sql"

[英]Instantiate empty IQueryable for use with Linq to sql

我需要能夠在 Linq 查詢中具有可選參數,或者如果需要從查詢中刪除該可選參數,則能夠將查詢分配給 IF 之類的 var。

如果我在 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
        {

試試這個。 您可以通過將T替換為類型名稱來創建具有T或特定類型的泛型類型。

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

試試這個:

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

您的問題是,當您在C#中聲明變量時,只能在當前范圍內聲明它。 因此,如果在if塊中聲明變量listOppLineData ,則只能在該塊內部使用它,而不能在其他任何地方使用它。 (您可以在另一個塊中定義另一個具有相同名稱的變量,但它將是一個完全不同的變量,因此它不會為您分配給第一個變量的值。)

正如您已經想到的那樣,您需要在if塊之外聲明變量。

您的第一次嘗試不起作用,因為編譯器發現您沒有明確指定變量的類型(這就是var所做的)並且您為變量分配了一個string 所以它推斷出變量的類型是string 而且你不能將不是string東西分配給這樣的變量。

您的第二次嘗試不起作用,因為您無法創建接口的實例。 (如果你想創建一個實例,它必須是一些特定的類型,通常是一個類。)即使你修復了它,非通用的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;

這個對我有用:

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之前,那么如果不需要的話,第二部分永遠不會被喚醒。 我仍然會使用.ToList()。

對我來說,答案是從現有查詢中設置為空,並且能夠毫無例外地調用異步,如果它被轉換為可枚舉: query = query.Take(0);<\/code>

"

您可以使用這樣的聲明:

var listOppLineData = (object)null;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM