在LINQ

时间:2017-05-12 18:23:19

标签: c# linq

问题:如何在以下代码中初始化 var ? [然后,当然,我会从 if 声明中删除var声明

以下代码的最后一行返回众所周知的错误:The name lstCurrent does not exists in current context。显然,错误是因为 var if 语句中定义,并在 if 语句

之外使用

注意:我只从表中选择几列,因此处理匿名类型。我在网上看到的一些例子没有用 - 可能是因为我的代码选择了匿名类型。但这只是猜测。

var lstCurrent =????;

if(Type==1)
  var lstCurrent =_context.Customers().Where(t =>t.type=="current").Select(c => new { c.LastName, c.City});
else
  lstCurrent  = _context.Customers().Where(...).Select(...)

return View(lstCurrent.ToList());

3 个答案:

答案 0 :(得分:1)

尝试

IEnumerable lstCurrent;
if(Type == 1)
    lstCurrent = foo;
else
    lstCurrent = bar;

答案 1 :(得分:0)

var不是一个类型 - 它意味着“我不关心(或不能)指定类型是什么 - 让编译器为我做”。

在您的情况下,您将为其分配两个查询之一的结果,其中一个查询返回匿名类型,因此您无法指定类型,因为您不知道匿名类型的名称(因此称为“匿名”)。

为了使用var,编译器在初始化时需要一些表达式来知道实际类型是什么。

我建议像:

var lstCurrent = Type==1 
              ? _context.Customers().Where(t =>t.type=="current").Select(c => new { c.LastName, c.City})
              : _context.Customers().Where(...).Select(...)

但请注意,您的“选择”必须返回相同的类型(或具有完全相同字段的匿名类型),否则您将无法使用var

最后,我会尝试将条件烘焙到Where子句中,以减少重复代码:

bool isTypeOne = Type==1;

var lstCurrent = _context.Customers()
                         .Where(t => isTypeOne ? t.type=="current" : ...)
                         .Select(c => new { c.LastName, c.City})

答案 2 :(得分:0)

  

如何在以下代码中初始化var? [然后,当然,我会   从if语句中删除var声明]

这是不可能的,因为您在左侧指定的对象类型应该是已知的。例如

var a = "text";

a的类型在编译时是已知的,因为右手表达式是string。这不能通过一系列匿名类型来完成,例如您定义的类型。

我可以看到两个选项。一个是D Stanley已经提到过。另一种是定义一个具有两个属性的类:

public class PersonCity
{
    public string LastName { get; set; }
    public string City { get; set; }
}

然后将查询的每个元素投影到PersonCity对象。

lstCurrent context.Customers()
                  .Where(t =>t.type=="current")
                  .Select(c => new PersonCity
                  { 
                      LastName = c.LastName, 
                      City = c.City
                  });

这样做,您现在可以定义lstCurrent,如下所示:

var lstCurrent = Enumerable.Empty<PersonCity>();

重要提示

如果您的查询返回不同类型,则上述无意义。两个查询(if中的一个和其他的查询)应该返回相同的类型。