我正在构建一个查询以返回与过滤器值匹配的组件,但是当我尝试添加新过滤器时遇到了
从作用域''引用的'Component'类型的变量'c',但它未定义
我一直在慢慢构建查询,并按照我的意愿进行以下工作
public ActionResult Index(string searchString, string typeFilter)
{
Supplier supplierAlias = null;
var query = Session.QueryOver<Component>()
.JoinAlias(x => x.Supplier, ()=> supplierAlias);
if (!string.IsNullOrWhiteSpace(searchString))
query = query.WhereRestrictionOn(c => c.Name)
.IsInsensitiveLike(String.Format("%{0}%", searchString));
switch (sortOrder)
{
case "Component desc":
query = query.OrderBy(c => c.Name).Desc;
break;
case "Type":
query = query.OrderBy(c=>c.ComponentType).Asc;
break;
case "Type desc":
query = query.OrderBy(c=>c.ComponentType).Desc;
break;
default:
query = query.OrderBy(c => c.Name).Asc;
break;
}
var result = query.List();
return View(result);
}
但现在我想添加一个选项供用户选择Type
进行过滤,就像searchString
目前有条件地添加Where一样。如果给出typeFilter
,那么添加另一个,但是当我尝试时,我会抛出异常。
我尝试使用Where
,WhereRestrictionOn
和And
- 我也尝试将typeFilter
块移到searchString
块之上,但它们都是给出相同的结果 - 这是例外。
if (!string.IsNullOrWhiteSpace(typeFilter))
query = query.And(c=>c.ComponentType.ToString() == typeFilter);
ComponentType
是我想允许用户过滤的枚举。
编辑(答案)
好吧,答案是使用Enum.Parse
,正如Rob G所说;它有点“繁琐”,所以我在这里发布了代码,因为它在这里比在评论中更容易阅读。
query = query.Where(c=> c.ComponentType == (Component.ComponentCode)Enum.Parse(typeof(Component.ComponentCode), typeFilter));
答案 0 :(得分:2)
使用Enum.TryParse
TheEnum enumType;
if (!string.IsNullOrWhiteSpace(typeFilter))
query = query.And(c => Enum.TryParse<TheEnum>(typeFilter, out enumType) && enumType== c.ComponentType)