我需要能够在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'
6条答案
按热度按时间jm2pwxwz1#
试试这个。你可以用T创建一个泛型类型,或者用你的类型名替换T来创建一个特定的类型。
w46czmvw2#
试试这个:
这是在定义变量,但您正在等待初始化它。
此外,查看查询,您可以在一个查询中完成所有操作,如下所示:
06odsfpq3#
问题在于,当你在C#中声明变量时,你只能在当前作用域中声明它,所以,如果你在
if
块中声明变量listOppLineData
,你只能在该块中使用它,而不能在其他任何地方使用。(您可以在另一个块中定义另一个同名变量,但它将是一个完全不同的变量,所以它不会有你赋给第一个变量的值。)正如您已经知道的,您需要在
if
块之外声明变量。你的第一次尝试没有成功,因为编译器发现你没有显式地指定变量的类型(
var
就是这么做的),而是给变量赋值了string
,所以它推断变量的类型是string
,而且你不能给这样的变量赋值不是string
的东西。你的第二次尝试没有成功,因为你不能创建接口的示例(如果你想创建一个示例,它必须是某个特定的类型,通常是一个类)。而且即使你修正了这个问题,非泛型的
IQueryable
也不知道其中项目的类型,所以foreach
不会很好地工作。但是你不需要给变量赋值,因为它在
if
的两个分支中都赋值了,这里正确的类型是泛型IQueryable<T>
,T
是opportunity_vw
,这意味着正确的代码是:如果你真的想给变量赋值(虽然这里没有理由这么做),你可以使用
null
(它代表没有值):vohkndzv4#
对于我来说,答案是从现有查询设置为空,并且能够毫无例外地调用async,如果它被转换为可枚举的话:
query1 = query1.Take(0);
它用于将来自不同表的2个查询合并到一个公共对象中,在某些验证情况下,其中一个查询可能会变为空。如果我将第一个查询从union移动到Enumerable,当调用union时,如果使用异步函数(ToListAsync())调用它,则会出现异常:
8gsdolmq5#
尝试添加. ToList();
更新
并修复查询。
如果没有. ToList(),您将没有任何内容可供迭代;
头部脱离尾部更新
把你的"short"放在OR之前,这样如果不需要的话,第二部分就不会被求值。不过我还是会使用. toList()。
ep6jt1vc6#
您可以像这样使用声明:
然后将该变量用作: