如何创建一个“全局”变量来返回 linq 结果?

问题描述 投票:0回答:5

假设我的视图中有一个下拉列表。不同的选择将使用不同的 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;
    }
c# linq model-view-controller
5个回答
1
投票

您可以声明一个自定义类型来代替匿名类型:

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 };

1
投票

不幸的是,你不能。有多种选择。使用

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);

0
投票

如果这确实是你的全部行动,那么你就不需要这样做。只需将

LinqResult =
替换为
return
即可。

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

var LinqResult = from ...

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

在这种特定情况下,它最终会成为匿名类型的

IEnumerable
,我认为您实际上无法声明它,至少不能以直接的方式声明。有一些关于它的讨论here


0
投票

如果您不需要在 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>
或定义结果类型。


0
投票

我也遇到了同样的问题,这是我找到的解决方案:

将以下行放入主类的全局部分:

System.Linq.IQueryable 查询名称;

这定义了查询表变量(queryname),现在可以在代码中的任何位置访问该变量。您还可以将数据库参考设置为全局:

DataContext db = new DataContext(SQLConnectionString);

“db”现在可以在代码中的任何位置使用。

当您想读取表格内容时,只需执行以下操作:

查询名称 = from x in db.tablename select x;

这会将“tablename”的全部内容读入“queryname”查询表中。

使用 Globals 的 90% 的工作是找到要声明的正确变量类型。我使用的一个技巧是使用“var”在本地定义变量,然后将其添加为调试器中的监视变量。然后,您可以转到监视窗口,它将显示要使用的确切变量类型名称。

© www.soinside.com 2019 - 2024. All rights reserved.