75

我需要能够在 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'
4

6 回答 6

217

试试这个。您可以使用T创建泛型类型,也可以通过将T替换为您的类型名称来创建特定类型。

IQueryable listOppLineData = Enumerable.Empty<T>().AsQueryable()
于 2015-04-03T10:52:43.987 回答
32

试试这个:

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
                      );
于 2013-02-21T01:31:04.657 回答
7

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

正如您已经知道的那样,您需要在if块之外声明变量。

您的第一次尝试没有奏效,因为编译器看到您没有明确指定变量的类型(就是这样var做的)并且您将 a 分配string给了变量。所以推断变量的类型是string. 而且您不能将不是 a 的东西分配string给此类变量。

您的第二次尝试没有成功,因为您无法创建接口的实例。(如果你想创建一个实例,它必须是某种特定的类型,通常是一个类。)即使你修复了它,非泛型IQueryable也不知道其中项目的类型,所以foreach不会工作好。

但是您不需要为变量分配任何值,因为它是在if. 而这里正确的类型是泛型IQueryable<T>Twithbeing opportunity_vw。这意味着正确的代码是:

IQueryable<opportunity_vw> listOppLineData;

if (whichGroup == "All")
{
    listOppLineData = …;
}
else
{
    listOppLineData = …;
}

foreach (var data in listOppLineData)
{
    …
}

如果您真的想为变量分配一些值(尽管这里没有理由这样做),您可以使用null(表示没有值):

IQueryable<opportunity_vw> listOppLineData = null;
于 2013-02-21T02:14:39.287 回答
1

对我来说,答案是从现有查询中设置为空,并且能够毫无例外地调用异步,如果它被转换为可枚举:

query1 = query1.Take(0);

它用于将来自不同表的 2 个查询合并到一个公共对象中,其中一个在某些验证情况下可能会变为空。如果我将第一个查询从联合移动到 Enumerable,我将得到异常,如果它将使用异步函数(ToListAsync())调用,当调用联合时:

var res = (await query1
    .Select(q1=> new NewClass(q1))
    .ToListAsync())
    .Union(query2
    .Select(q2=> new NewClass(q2)))
    .ToList();
于 2022-02-03T13:24:32.483 回答
-1

尝试添加 .ToList();

var listOppLineData = (from o in db.opportunity_vws
                                   where o.fiscal_yr_and_qtr == qtr
                                   select o
                                  ).ToList();

更新

并修复查询。

如果没有 .ToList(); ,您将没有任何可以迭代的内容;

Head Out of Butt 更新

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

将您的“短”放在 OR 之前,因此如果不需要,则永远不会评估第二部分。不过,我仍然会使用 .ToList() 。

于 2013-02-21T01:29:24.203 回答
-1

您可以使用这样的声明:

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
);
于 2021-09-25T10:09:14.343 回答