如何创建一个'global'变量来返回linq结果?



假设我的视图中有一个下拉列表。不同的选择将使用不同的linq结果,需要返回到视图。

我已经完成了查看页面。现在在我的控制器上,我有点卡住了。我知道var不能用作"global"变量声明。但是我该怎么做呢?

这是我的代码:

[HttpPost]
public ActionResult About(string Linq)
{
IEnumerable<NorthwindResult> Linq1;
switch (Linq)
{                
case "Most Expensive":
Linq1 = from Products in northwindEntities.Products
where
Products.UnitPrice ==
(from Products0 in northwindEntities.Products
select new
{
Products0.UnitPrice
}).Max(p => p.UnitPrice)
select new NorthwindResult
{
ProductName = Products.ProductName,
UnitPrice = Products.UnitPrice
};
break;
case "Above Average":
Linq1 = from Products in northwindEntities.Products
where
Products.UnitPrice >
(from Products0 in northwindEntities.Products
select new
{
Products0.UnitPrice
}).Average(p => p.UnitPrice)
orderby Products.UnitPrice descending
select new NorthwindResult
{
ProductName = Products.ProductName,
UnitPrice = Products.UnitPrice
};
break;
default:
break;
}
return Linq1;
}

您可以声明要使用的自定义类型,而不是匿名类型:

public class ProductPrice
{
public string Name { get; set; }
public decimal Price { get;  set; }
}

然后LinqResult被声明为

IEnumarable<ProductPrice> LinqResult;

然后将select更改为

select new ProductPrice { Name = Products.Product name,  Price = Products.UnitPrice };

很遗憾,您不能。有多种选择。使用dynamic或返回一个对象。例如IEnumerable<object>IList<object>。或者,您可以使用ProductName和UnitPrice作为poco创建产品模型。

编辑:

这一个很粗糙,但可以使用。

void GetObject<T>(object anonymousObject, T cast)
{
return (T) anonymousObject;
}

在你的模型上,你可以这样调用:

object linqResult;
// retrieve linqResult data;
....
var obj = GetObject(linqResult, new  { ProductName = "Honda", UnitPrice = 20.0 };
This variable can be accessed as 
Console.WriteLine(obj.ProductName);

如果这真的是你的全部操作,那么你不需要。只需将LinqResult =替换为return即可。

但是,如果你真的需要弄清楚类型,我通常会临时声明我设置的变量:

var LinqResult = from ...

然后,在VisualStudio中,将光标悬停在变量名上,它会告诉我类型。然后我更改代码并用类型声明变量。

在这种特定的情况下,它最终将是一个匿名类型的IEnumerable,我认为你实际上不能声明它,至少不能直接声明。这里有一些关于它的讨论。

如果在切换块之后不需要对变量做任何操作,我只会从切换块内部返回,例如

switch (Linq)
{                
case "Most Expensive":
return from Products in northwindEntities.Products
...
case "Above Average":
return from Products in northwindEntities.Products
....
}
return null;

否则,在声明变量时必须定义一个类型,除非编译器可以通过赋值来确定类型。

您可能希望使用List<object>|IEnumerable<object>|IEnumerable<dynamic>或定义结果类型。

最新更新