【问题标题】:How to create a 'global' variable to return linq result?如何创建一个“全局”变量来返回 linq 结果?
【发布时间】:2018-12-13 02:12:59
【问题描述】:

假设我的视图中有一个下拉列表。不同的选择会使用不同的 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


    【解决方案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 };
    

    【讨论】:

    • 您好,我尝试了您的解决方案,但是当我返回 LinqResult 时,它显示“未使用未分配的局部变量 LinqResult”。我已经在原帖中更新了我的最新代码。
    【解决方案2】:

    很遗憾,你不能。有多种选择。要么使用dynamic,要么返回一个对象。例如。例如IEnumerable&lt;object&gt;IList&lt;object&gt;。或者,您可以创建一个 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);
    

    【讨论】:

      【解决方案3】:

      如果这确实是您的全部操作,那么您不需要这样做。只需将LinqResult = 替换为return

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

      var LinqResult = from ...
      

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

      在这种特定情况下,它将最终成为匿名类型的 IEnumerable,我认为您实际上无法声明,至少不能以直接的方式声明。有一些关于它的讨论here

      【讨论】:

        【解决方案4】:

        如果你不需要在 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&lt;object&gt; | IEnumerable&lt;object&gt; | IEnumerable&lt;dynamic&gt; 或定义结果类型。

        【讨论】:

          猜你喜欢
          • 2022-07-12
          • 1970-01-01
          • 1970-01-01
          • 2020-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-29
          • 1970-01-01
          相关资源
          最近更新 更多