use*_*077 47 c# linq asp.net-mvc iqueryable 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
{
Run Code Online (Sandbox Code Playgroud)
我需要在我认为的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'
Run Code Online (Sandbox Code Playgroud)
Kri*_*hna 136
试试这个.您可以通过将T替换为类型名称来创建具有T或特定类型的泛型类型.
IQueryable listOppLineData = Enumerable.Empty<T>().AsQueryable()
Run Code Online (Sandbox Code Playgroud)
Sim*_*n C 20
试试这个:
IQueryable<opportunity_vw> listOppLineData;
Run Code Online (Sandbox Code Playgroud)
这是定义变量,但您正在等待初始化它.
另外,查看您的查询,您可以将其全部集中在一起,如下所示:
var listOppLineData = (from o in db.opportunity_vws
where o.fiscal_yr_and_qtr == qtr && (o.Group == whichGroup || whichGroup == "All")
select o
);
Run Code Online (Sandbox Code Playgroud)
agi*_*Dev 13
这个对我有用:
IQueryable<string> _labTests = Enumerable.Empty<string>().AsQueryable();
Run Code Online (Sandbox Code Playgroud)
您的问题是,当您在C#中声明变量时,只在当前范围内声明它.因此,如果您listOppLineData在if块中声明变量,则只能在该块内使用它,而不能在其他任何位置使用它.(您可以在另一个块中定义另一个具有相同名称的变量,但它将是一个完全不同的变量,因此它不会将您分配给第一个变量的值.)
正如您已经想到的那样,您需要在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)
{
…
}
Run Code Online (Sandbox Code Playgroud)
如果你真的想为变量赋值(尽管这里没有理由这样做),你可以使用null(它代表没有值):
IQueryable<opportunity_vw> listOppLineData = null;
Run Code Online (Sandbox Code Playgroud)