无法创建类型为“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;
    }

无法创建类型为“EShop.ClassLibrary.ProductType”的常量值.在此上下文中仅支持基元类型或枚举

我认为你必须用以下代码行处理它的问题:

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,因为尽管 customerAcustomerB 的所有值都具有相同的值,但customerAcustomerB是两个不同的对象。请看这里。