首页 > 解决方案 > LINQ 查询错误:无法创建类型的常量值。此上下文仅支持原始类型或枚举类型

问题描述

我有一个对象列表,其中包含List<Contract> endedContracts已从较大列表中过滤掉的合同信息。我现在正在尝试将此列表中的信息与我的数据库中的记录相匹配,并使用一些进一步的过滤器。

var endedContracts = _contracts
    .Where(x => x.Contract.IsContractInLastBillingPeriod(referencePeriod))
    .Where(x => x.Contract.IsContractCoveredByLiveInvoices(x.Contract.Invoices)).ToList();

当我运行以下查询时,我得到了错误。

var crystallisedCommissions = _context.Contracts
   .Where(x => x.Statement.Sent)
   .Where(x => x.Statement.Broker == endedContracts.First().Broker.Code)
   .Where(x => !Period.IsPeriodBeforeReferencePeriod(x.Statement.Period, CUT_OFF_PERIOD))
   .Where(x => endedContracts.Any(y => y.Contract.Identifier == x.Identifier
                                    && y.Contract.StartDate == x.ContractStartDate
                                    && y.Contract.EndDate == x.ContractEndDate)).ToList();

确切的错误:

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

标签: c#entity-frameworklinq

解决方案


endedContracts是内存中的列表,不能在此查询中直接使用。相反,在查询之外获取您需要的值,例如:

//Get the code here
var brokerCode = endedContracts.First().Broker.Code;

var crystallisedCommissions = _context.Contracts
   .Where(x => x.Statement.Sent)
   .Where(x => x.Statement.Broker == brokerCode) //Use the code here
   .Where(x => !Period.IsPeriodBeforeReferencePeriod(x.Statement.Period, CUT_OFF_PERIOD))
   .Where(x => endedContracts.Any(y => y.Contract.Identifier == x.Identifier
                                    && y.Contract.StartDate == x.ContractStartDate
                                    && y.Contract.EndDate == x.ContractEndDate)).ToList();

推荐阅读