【问题标题】:LINQ statement - WHERE clause for ENUM typeLINQ 语句 - ENUM 类型的 WHERE 子句
【发布时间】:2016-01-20 17:58:49
【问题描述】:

我按照 MSDN 教程介绍了 ASP.NET MVC Web 应用程序中的过滤功能 > http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net-mvc-application

很遗憾,我无法选择具有枚举属性的对象。

使用的型号是:

public Bus()
    {
    public int BusID { get; set; }
    public string RegNum { get; set; }
    public Status? Status { get; set; }
    public string Latitude { get; set; }
    public string Longitude { get; set; }
    }

枚举类型在哪里:

public enum Status
{
    ON, OFF
}

根据上面提到的教程,我在 BusController 中实现了排序方法,如下所示:

public ViewResult Index(string searchString)
    {
        var buses = from b in db.Buses select b;
        if (!String.IsNullOrEmpty(searchString))
        {
            buses = buses.Where(b =>
                b.RegNum.ToUpper().Contains(searchString.ToUpper())
                );
        }

        return View(buses.ToList());
    }

它适用于 RegNum 过滤,但我无法通过搜索字符串值选择给定状态的总线。

b.Status.Equals(searchstring) 不起作用。

如有任何提示,我将不胜感激

【问题讨论】:

    标签: c# asp.net asp.net-mvc linq enums


    【解决方案1】:

    这是因为Status 不是string。您可能希望使用

    searchString 转换为 Status
    Status searchStatus = Enum.Parse(typeof(Status), searchString.ToUpper());
    

    首先在查询中使用它(注意:不要将解析代码直接放入查询中)。或Enum.TryParse 以避免潜在的异常。另请注意,保存在数据库中的内容是 int,0 表示 ON,1 表示 OFF。

    【讨论】:

      【解决方案2】:

      尝试以下更改:

       public class Bus
      {
          public int BusID { get; set; }
          public string RegNum { get; set; }
          public Status Status { get; set; }
          public string Latitude { get; set; }
          public string Longitude { get; set; }
      }
      

      将状态作为第二个参数并过滤两者。示例代码如下。

             public static IEnumerable<Bus> FilterBuses(string searchString, Status status)
          {
              //Setup some dummy data
              var buses = new List<Bus>()
              {
                  new Bus() { BusID = 12, RegNum = "Twelve", Status = Status.ON},
                  new Bus() { BusID = 13, RegNum = "Thirteen", Status = Status.OFF},
                  new Bus() { BusID = 20, RegNum = "Twenty", Status = Status.OFF}
              };
      
              IEnumerable<Bus> filteredList = new List<Bus>();
              if (!String.IsNullOrEmpty(searchString))
              {
                  filteredList = buses.Where<Bus>(b => 
                      b.RegNum.ToUpper().Contains(searchString.ToUpper()) &&
                      b.Status == status);
              }
      
              return filteredList.ToList();
          }
      

      然后,您可以按如下方式调用该方法:

              // Expect only Twelve bus
              var result = LinqTestMethod.FilterBuses("Twelve", Status.ON);
      
              // Expect no buses
              result = LinqTestMethod.FilterBuses("Twelve", Status.OFF);
      
              // Expect 2 buses -- Twelve and Twenty
              result = LinqTestMethod.FilterBuses("T", Status.OFF);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-19
        • 2023-03-08
        相关资源
        最近更新 更多