【问题标题】:Unable to create a constant value of type 'Project.Models.Subcategory'. Only primitive types or enumeration types are supported in this context无法创建类型为“Project.Models.Subcategory”的常量值。此上下文仅支持原始类型或枚举类型
【发布时间】:2014-12-31 20:56:01
【问题描述】:

我有一个代码段和这样的查询:

        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();

我收到一条错误消息:

无法创建类型的常量值 '项目.模型.子类别'。只有原始类型或枚举 在此上下文中支持类型。

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

【问题讨论】:

  • 重点是business的value应该为null:不,永远不应该为null。根据经验,任何返回可枚举的 LINQ 方法都不会返回 null,而是返回空的可枚举。

标签: c# asp.net-mvc linq


【解决方案1】:

关键是企业的价值应该是空的。但是当我签入调试器时,它的值如下:{System.Data.Entity.Infrastructure.DbQuery}。

那是因为延迟执行。在您实际从查询中请求任何数据(例如,通过您的AsEnumerable())之前,不会执行查询,因此错误也不会出现,直到它出现。正如 Dirk 所指出的:它永远不会是 null,而是带有 0 个项目的 IEnumerable。

无法创建“Project.Models.Subcategory”类型的常量值。此上下文仅支持原始类型或枚举类型。

这告诉您,不支持在复杂类型上使用像 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();

提示:
由于您只是试图检查业务是否存在,这会更快,因为它只会产生一个 DB 查询并且不会实现实体:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2020-10-08
    • 2013-04-30
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多