我需要在switch语句之外声明查询变量,因为我只有一个变量可以处理LINQ Query的不同结果。请参阅下面的代码。这里的问题是我无法在不初始化的情况下推断变量
var query;
Switch(filter)
{
case 1:
var query = from c in Customers
where c.Type equals == 'ABC'
select c;
break;
case 2:
var query = from c in Customers
where c.Type equals == 'CDE'
select c;
break;
}
foreach(var custrow in query)
{
//Do Logic
}
}
答案 0 :(得分:5)
您可能需要IEnumerable<Customer>
或IQueryable<Customer>
而不是var。
答案 1 :(得分:2)
不,因为它们必须在声明它们的同时进行初始化,编译器不知道要为变量分配什么类型。
我想你会想要类似的东西。
IQueryable<Customers> query;
假设查询返回IQueryable of Customers。
这样的整体设计可能会更好。
IQueryable<Customers> query;
Switch(filter)
{
case 1:
query = Customers.Where(c => c.Type == "ABC");
break;
case 2:
query = Customers.Where(c => c.Type == "CDE");
break;
}
foreach(var custrow in query)
{
//Do Logic
}
答案 2 :(得分:0)
讨厌指出这一点,但是:
var query;
不会编译。需要立即分配推断变量。
我同意上述答案。您需要将其声明为IEnumerable<Customer>
或IQueryable<Customer>
才能生效。
答案 3 :(得分:0)
除了同意Scott,Nathan&amp;乔恩,我想指出,重建这一点可能是一个好主意。保持函数只做一件事总是一个好习惯:
private IEnumerable<Customer> FetchCustomers(FilterType filter)
{
switch (filter)
{
// Switch logic comes here
}
}
private void ProcessCustomers(IEnumerable<Customer> customers)
{
foreach (var customer in customers)
{
// Process logic comes here
}
}
private void FetchAndProcessCustomers(FilterType filter)
{
ProcessCustomers(FetchCustomers(filter));
}
现在它看起来更好更简单,作为奖励,关于推断变量的问题就消失了!