假设我的视图中有一个下拉列表。不同的选择将使用不同的 linq 结果,需要返回到视图。
我已经完成了查看页面。现在在我的控制器上,我有点卡住了。 我知道 var 不能用作“全局”变量声明。但那我该怎么办呢?
这是我的代码:
[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>
。或者您可以创建一个 Product 模型,其中 ProductName 和 UnitPrice 为 poco。
编辑:
这个有点hacky,但是可以用。
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 ...
然后,在 Visual Studio 中,将光标悬停在变量名称上,它会告诉我类型。然后我更改代码并使用类型声明变量。
在这种特定情况下,它最终会成为匿名类型的
IEnumerable
,我认为您实际上无法声明它,至少不能以直接的方式声明。有一些关于它的讨论here。
如果您不需要在 switch 块之后对变量执行任何操作,我只需从 switch 块内部返回,例如
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>
或定义结果类型。
我也遇到了同样的问题,这是我找到的解决方案:
将以下行放入主类的全局部分:
System.Linq.IQueryable
这定义了查询表变量(queryname),现在可以在代码中的任何位置访问该变量。您还可以将数据库参考设置为全局:
DataContext db = new DataContext(SQLConnectionString);
“db”现在可以在代码中的任何位置使用。
当您想读取表格内容时,只需执行以下操作:
查询名称 = from x in db.tablename select x;
这会将“tablename”的全部内容读入“queryname”查询表中。
使用 Globals 的 90% 的工作是找到要声明的正确变量类型。我使用的一个技巧是使用“var”在本地定义变量,然后将其添加为调试器中的监视变量。然后,您可以转到监视窗口,它将显示要使用的确切变量类型名称。