实例化空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
        {

我需要在我认为的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'
5个解决方案
132 votes

尝试这个。 您可以通过用您的类型名称替换T来创建具有T或特定类型的通用类型。

IQueryable listOppLineData = Enumerable.Empty<T>().AsQueryable()
Krishna answered 2020-02-20T03:04:53Z
20 votes

尝试这个:

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
                      );
Simon C answered 2020-02-20T03:04:31Z
5 votes

您的问题是,当您在C#中声明变量时,只能在当前作用域中声明它。 因此,如果在IQueryable<T>块中声明了变量null,则只能在该块内部使用它,而不能在其他任何地方使用它。 (您可以在另一个块中定义另一个具有相同名称的变量,但这将是一个完全不同的变量,因此它不会具有您分配给第一个变量的值。)

如您所想,您需要在null块外部声明变量。

您的第一次尝试没有用,因为编译器发现您没有明确指定变量的类型(这就是null所做的事情),并且您为变量分配了IQueryable<T>。 因此,可以推断出该变量的类型为2755325698557608608962。并且您不能为该变量分配不是opportunity_vw的值。

您的第二次尝试不起作用,因为您无法创建接口的实例。 (如果要创建一个实例,则它必须是某种特定的类型,通常是一个类。)即使您修复了该问题,非通用null也不知道其中的项目类型,因此IQueryable<T>不会 运作良好。

但是您不需要为变量分配任何值,因为它是在null的两个分支中分配的。此处的正确类型是通用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;
svick answered 2020-02-20T03:05:39Z
3 votes

这个对我有用:

IQueryable<string> _labTests = Enumerable.Empty<string>().AsQueryable();
agileDev answered 2020-02-20T03:05:59Z
0 votes

尝试添加.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);

将“ short”放在“ OR”之前,因此,如果不需要第二部分,则永远不会回避。 我仍然会使用.ToList()。

Trey Gramann answered 2020-02-20T03:06:41Z
translate from https://stackoverflow.com:/questions/14993048/instantiate-empty-iqueryable-for-use-with-linq-to-sql