2016-01-20 52 views
1

我跟着关于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-applicationLINQ语句 - 用于ENUM类型

不幸的是,我无法选择它有一个枚举attriubute对象MSDN教程条款。

使用的模型是:

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过滤工作正常,但我无法通过searchstri为给定状态选择总线ng值。

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

我会很感激的任何提示

回答

2

这是因为Status不是string。你可能想在searchString转换为Status

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

第一,然后使用在查询(注:不要直接把解析代码到查询)。或者Enum.TryParse以避免可能的例外。还要注意,你的数据库中保存的是一个int,0表示ON,1表示OFF。

0

请尝试以下变化:

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