我在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)不起作用。
我会感激任何提示
答案 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);