问题:如何在以下代码中初始化 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());
答案 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中的一个和其他的查询)应该返回相同的类型。