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

Posted

技术标签:

【中文标题】无法创建类型为“x”的常量值。此上下文仅支持原始类型或枚举类型【英文标题】:Unable to create a constant value of type 'x'. Only primitive types or enumeration types are supported in this context 【发布时间】:2020-10-08 19:45:51 【问题描述】:

我想从 visaConfigurationDocuments 表中获取 VisaCodeIds 列表并与 visaCodes 表一起获取 VisaCodeName 和 我收到以下查询的此错误:

     public List<VisaCodesNamesDto> GetVisaCodesNames(List<VisaCodesNamesInputDto> input)
    


        var result = (from visaConfigurationDocuments in Context.VisaConfigurationDocuments
                      join visaCodes in Context.VisaCodes
                      on visaConfigurationDocuments.VisaCodeId equals visaCodes.VisaCodeId
                      where (input.Any(x => x.VisaId == visaConfigurationDocuments.VisaId && x.VersionNo == visaConfigurationDocuments.VersionNo))
                      select new VisaCodesNamesDto
                      
                          VisaCodeName = visaCodes.NameAr,
                          VisaId = visaConfigurationDocuments.VisaId,
                          VersionNo = visaConfigurationDocuments.VersionNo
                      ).ToList();

        return result;
    

【问题讨论】:

好吧,考虑一下如何将 LINQ 转换为 SQL。什么 SQL 代码将表示 List&lt;VisaCodesNamesInputDto&gt; 类型的非数据库对象?然后考虑错误消息的文本。我相信你会拼凑起来的。 我知道问题,但如何有效地解决它 您可以在查询中运行单个变量 where 子句,然后在返回结果后按内存中的第二个变量进行过滤。 【参考方案1】:
public List<VisaCodesNamesDto> GetVisaCodesNames(List<VisaCodesNamesInputDto> input) 
    var ids = input.Select(i => i.VisaId).ToList();
    // filter by a single variable...
    var result = Context.VisaConfigurationDocuments
        .Where(vcd => ids.Contains(vcd.VisaId))
        .Select(vcd => new 
            VisaCodeName = visaCodes.NameAr,
            VisaId = visaConfigurationDocuments.VisaId,
            VersionNo = visaConfigurationDocuments.VersionNo
        )
        .ToList();

    // now filter by the second variable...
    result = result
        .Where(dto => input.Any(i => i.VisaId == dto.VisaId && i.VersionNo == dto.VersionNo)
        .ToList();

    return result;

【讨论】:

【参考方案2】:
        public List<VisaCodesNamesDto> GetVisaCodesNames(List<VisaCodesNamesInputDto>input)
    


        List<string> filterlist = input.Select(x => x.VisaId.ToString() + "-" + x.VersionNo).ToList();


        var result = (from visaConfigurationDocuments in Context.VisaConfigurationDocuments
                      join visaCodes in Context.VisaCodes
                      on visaConfigurationDocuments.VisaCodeId equals visaCodes.VisaCodeId
                      where filterlist.Any(x => x == visaConfigurationDocuments.VisaId.ToString() + "-" + visaConfigurationDocuments.VersionNo)
                      select new VisaCodesNamesDto
                      
                          VisaCodeNameAr = visaCodes.NameAr,
                          VisaCodeNameEn = visaCodes.NameEn,
                          VisaId = visaConfigurationDocuments.VisaId,
                          VersionNo = visaConfigurationDocuments.VersionNo
                      ).ToList();

        return result;

我做了一个解决方案来解决我在 where 子句中转换复杂对象类型的问题

【讨论】:

以上是关于无法创建类型为“x”的常量值。此上下文仅支持原始类型或枚举类型的主要内容,如果未能解决你的问题,请参考以下文章

无法创建类型为“EShop.ClassLibrary.ProductType”的常量值。此上下文仅支持原始类型或枚举类型

无法创建类型的常量值。此上下文仅支持基元类型或枚举类型。

无法创建“System.Object”类型的常量值。此上下文仅支持基元类型或枚举类型

无法创建“匿名类型”类型的常量值。此上下文仅支持基元类型或枚举类型。

此上下文仅支持原始类型或枚举类型

错误:“在此上下文中仅支持原始类型或枚举类型”