示例化空的IQueryable以用于Linq to sql

30byixjq  于 2023-01-22  发布在  其他
关注(0)|答案(6)|浏览(172)

我需要能够在Linq查询中有一个可选参数,或者如果需要从查询中删除该可选参数,则能够将查询分配给IF之类的变量。
如果我在IF语句中设置了查询变量,那么当我试图循环遍历它时,它会告诉我该变量不存在于上下文中。

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'
jm2pwxwz

jm2pwxwz1#

试试这个。你可以用T创建一个泛型类型,或者用你的类型名替换T来创建一个特定的类型。

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

w46czmvw2#

试试这个:

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

06odsfpq3#

问题在于,当你在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;
vohkndzv

vohkndzv4#

对于我来说,答案是从现有查询设置为空,并且能够毫无例外地调用async,如果它被转换为可枚举的话:
query1 = query1.Take(0);
它用于将来自不同表的2个查询合并到一个公共对象中,在某些验证情况下,其中一个查询可能会变为空。如果我将第一个查询从union移动到Enumerable,当调用union时,如果使用异步函数(ToListAsync())调用它,则会出现异常:

var res = (await query1
    .Select(q1=> new NewClass(q1))
    .ToListAsync())
    .Union(query2
    .Select(q2=> new NewClass(q2)))
    .ToList();
8gsdolmq

8gsdolmq5#

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

ep6jt1vc

ep6jt1vc6#

您可以像这样使用声明:

var listOppLineData = (object)null;

然后将该变量用作:

listOppLineData = (from o in db.opportunity_vws
    where o.fiscal_yr_and_qtr == qtr && (o.Group == whichGroup || whichGroup == "All")
    select o
);

相关问题