LINQ语句 - ENUM类型的WHERE子句

时间:2016-01-20 17:58:50

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

我在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

不幸的是,我无法选择具有enum attriubute的对象。

使用的模型是:

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过滤,但我不能通过searchstring值为给定状态选择总线。

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

我会感激任何提示

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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);