我有一个代码段和类似的查询:
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 ;.只有原始类型或枚举 在这种情况下支持类型。
知道问题可能是什么,以及如何解决?
答案 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));
如果您想立即执行查询,可以通过多种方式执行此操作,例如:
转换为(正如您之前在代码中所做的那样)或另存为IEnumerable
,因为在这种情况下只有IQueryable
支持延迟执行:
IEnumerable<Business> businesses = db.Businesses....
调用实现方法/扩展名:
var businesses = db.Businesses.Where(...).ToList();
<强>提示:强>
由于您只是想检查业务是否存在,因此它会更快,因为它只会导致一个数据库查询并且不会实现实体:
int businesses = db.Businesses.Count(b => b.StateID == rvm.StateID
&& b.Subcategories.Any(s => s.SubcategoryName == sid));
if (businesses <= 0)
return View("NoBusinessFoundInSubcategory");