【发布时间】:2013-03-31 03:54:19
【问题描述】:
我正在构建一个查询以返回与过滤器值匹配的组件,但是当我尝试添加新过滤器时遇到了
从范围“”引用的“组件”类型的变量“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));
【问题讨论】:
标签: c# asp.net-mvc nhibernate