[英]Create empty IQueryable<T> for Linq to SQL and concat it later
[英]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>
,其中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之前,那么如果不需要的話,第二部分永遠不會被喚醒。 我仍然會使用.ToList()。
對我來說,答案是從現有查詢中設置為空,並且能夠毫無例外地調用異步,如果它被轉換為可枚舉: query = query.Take(0);<\/code>
"
您可以使用這樣的聲明:
var listOppLineData = (object)null;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.