实例化空IQueryable以用于Linq to sql

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)

  • 为什么不使用这个: IQueryable&lt;T&gt; hierarchies = new List&lt;T&gt;().AsQueryable(); (4认同)

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)


svi*_*ick 5

您的问题是,当您在C#中声明变量时,只在当前范围内声明它.因此,如果您listOppLineDataif块中声明变量,则只能在该块内使用它,而不能在其他任何位置使用它.(您可以在另一个块中定义另一个具有相同名称的变量,但它将是一个完全不同的变量,因此它不会将您分配给第一个变量的值.)

正如您已经想到的那样,您需要在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)
{
    …
}
Run Code Online (Sandbox Code Playgroud)

如果你真的想为变量赋值(尽管这里没有理由这样做),你可以使用null(它代表没有值):

IQueryable<opportunity_vw> listOppLineData = null;
Run Code Online (Sandbox Code Playgroud)