无法创建类型为“EShop.ClassLibrary.ProductType”的常量值.在此上下文中仅支持基元类型或枚举
本文关键字:类型 上下文 枚举 支持 常量 创建 EShop ClassLibrary ProductType | 更新日期: 2023-09-27 18:34:19
我有这个 2 类,该产品与产品类型相关,但是当使用以下代码时,我看到以下错误。
无法创建类型为"EShop.ClassLibrary.ProductType"的常量值。在此上下文中仅支持基元类型或枚举类型
它们与 ProductType LinkProductTypeId 相关
public class Product
{
[Key]
public virtual int ProductID { get; set; }
public virtual ProductType LinkProductTypeId { get; set; }
public virtual string Name { get; set; }
public virtual string EngName { get; set; }
public virtual RelatedProduct ProductRelated { get; set; }
public virtual decimal BuyCost { get; set; }
public virtual decimal SellCost { get; set; }
}
public class ProductType
{
public virtual int ProductTypeId { get; set; }//id in ef
public virtual string Name { get; set; }
}
运行时代码是这样的:
public static List<SelectListItem> GetProductSelectList()
{
ProductType type = _db.productType.Single(t => t.ProductTypeId == 1);
List<Product> m = (_db.product.Where(r => r.LinkProductTypeId == type) ).ToList();//error line
List<SelectListItem> sa = new List<SelectListItem>();
foreach (Product item in m)
{
sa.Add(new SelectListItem { Text = item.Name, Value = item.ProductID.ToString() });
}
return sa;
}
我认为你必须用以下代码行处理它的问题:
List<Product> m = (_db.product.Where(r => r.LinkProductTypeId == type)).ToList();
似乎在那里,您尝试获得所有LinkProductTypeId
等于 type
的产品,您以前已经得到过。您可能无法使用相等运算符解析这些对象的相等性。
我的建议是使用ProductTypeId
来做到这一点。在代码方面:
List<Product> m = (_db.product.Where(r => r.LinkProductTypeId.ProductTypeId ==
type.ProductTypeId)).ToList();
如果 ProductTypeId
对于每个ProductType
都是唯一的,看起来就是这样,那么上面的内容就可以完成您的工作。
为什么上面有效,而前一个不起作用?
以上有效,因为您只需比较比较两个整数,如果它们具有相同的值,则Where
中的谓词返回true
并且当前项目将包含在列表中。
前面它不起作用,因为两个引用类型之间的==
是寻找引用相等性,而不是对象的相应字段具有相同的值。
让我们有一堂课
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public Customer(string firstName, string lastName, int age)
{
FirstName = firstName;
LastName = lastName;
Age = age;
}
}
然后这个控制台应用
public class Program
{
public static void Main()
{
var customerA = new Customer("firstname","lastname",22);
var customerB = new Customer("firstname","lastname",22);
Console.WriteLine(customerA==customerB);
}
}
将输出false
,因为尽管 customerA
和 customerB
的所有值都具有相同的值,但customerA
和customerB
是两个不同的对象。请看这里。