构建NHibernate查询throws - 从范围''引用的类型的变量'x',但它没有定义

时间:2013-03-30 16:25:28

标签: c# asp.net-mvc nhibernate

我正在构建一个查询以返回与过滤器值匹配的组件,但是当我尝试添加新过滤器时遇到了

  

从作用域''引用的'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,那么添加另一个,但是当我尝试时,我会抛出异常。

我尝试使用WhereWhereRestrictionOnAnd - 我也尝试将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));

1 个答案:

答案 0 :(得分:2)

使用Enum.TryParse

TheEnum enumType;
if (!string.IsNullOrWhiteSpace(typeFilter))
     query = query.And(c => Enum.TryParse<TheEnum>(typeFilter, out enumType) && enumType== c.ComponentType)