假设我的视图中有一个下拉列表。不同的选择将使用不同的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>
或定义结果类型。