无法创建类型' Project.Models.Subcategory'的常量值。在此上下文中仅支持基元类型或枚举类型

时间:2014-12-31 12:40:12

标签: c# asp.net-mvc linq

我有一个代码段和类似的查询:

        var sub = db.Subcategories.Where(s => s.SubcategoryName == sid).FirstOrDefault();
        var businesses = db.Businesses.Where(b => b.StateID == rvm.StateID && b.Subcategories.Contains(sub));

        if (businesses == null)
        {
            return View("NoBusinessFoundInSubcategory");
        }

重点是businesses的值应为null。但是当我在调试器中签入时,它的值如下:{System.Data.Entity.Infrastructure.DbQuery<Project.Models.Business>}。当它遇到代码后面定义的另一个查询时,就是这个:

var list = businesses.AsEnumerable().OrderBy(b => Math.Abs(Convert.ToInt32(temp) - Convert.ToInt32(b.Zip))).Take(10).ToList();

我收到一条错误消息:

  

无法创建类型的常量值   &#39; Project.Models.Subcategory&#39 ;.只有原始类型或枚举   在这种情况下支持类型。

知道问题可能是什么,以及如何解决?

1 个答案:

答案 0 :(得分:1)

  

关键是企业的价值应为空。但是当我在调试器中检查它时,它有一个这样的值:{System.Data.Entity.Infrastructure.DbQuery}。

这是因为延期执行。在您实际请求查询中的任何数据之前(例如,通过您的AsEnumerable()),查询不会被执行,因此错误也不会显示出来。正如Dirk所指出的那样:它永远不会是null,而是IEnumerable,只有0项。

  

无法创建类型&#39; Project.Models.Subcategory&#39;的常量值。在此上下文中仅支持原始类型或枚举类型。

这告诉您,不支持在复杂类型上使用Contains(sub)之类的方法。您需要执行以下操作:

var businesses = db.Businesses.Where(b => b.StateID == rvm.StateID
             && b.Subcategories.Any(s => s.SubcategoryName == sub.SubcategoryName));

如果您想立即执行查询,可以通过多种方式执行此操作,例如:

  1. 转换为(正如您之前在代码中所做的那样)或另存为IEnumerable,因为在这种情况下只有IQueryable支持延迟执行:

    IEnumerable<Business> businesses = db.Businesses....

  2. 调用实现方法/扩展名:

    var businesses = db.Businesses.Where(...).ToList();

  3. <强>提示:
    由于您只是想检查业务是否存在,因此它会更快,因为它只会导致一个数据库查询并且不会实现实体:

    int businesses = db.Businesses.Count(b => b.StateID == rvm.StateID
                            && b.Subcategories.Any(s => s.SubcategoryName == sid));
    if (businesses <= 0)
        return View("NoBusinessFoundInSubcategory");