【问题标题】:Building NHibernate query throws - variable 'x' of type referenced from scope '', but it is not defined构建NHibernate查询抛出-从范围''引用的类型的变量'x',但未定义
【发布时间】: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,则添加另一个位置,但当我尝试时,我会抛出异常。

我尝试过使用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));

【问题讨论】:

    标签: c# asp.net-mvc nhibernate


    【解决方案1】:

    使用 Enum.TryParse

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

    【讨论】:

    • 这无法编译,但我尝试对其进行重构,但最终出现了关于未定义变量的相同错误。 if (!string.IsNullOrWhiteSpace(typeFilter)) query = query.Where(c =&gt; (Enum.Parse(typeof(ComponentIndexViewModel.ComponentCode), c.ComponentType.ToString())).ToString() == typeFilter);
    • 你能放一个断点,看看那个时候的 ComponentType 是什么吗?
    • typeFilter 中的值是枚举的有效字符串表示形式,但调试器不会分解表达式以确定 c.ComponentType 是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多