LINQ to Entities不支持LINQ表达式节点类型“Invoke”

时间:2011-04-07 20:08:43

标签: c# .net entity-framework linq-to-entities

我正在尝试通过lambda表达式在我的EF查询中实现一个'IN'子句,如下所示:

        /*lambda expression to evaluate: status in[a, b, c...n]*/
        _IN myIN = (allStatus, status) =>
        {
            bool lambdaResult = false;
            foreach (int s in statuses)
            {
                if (status == s)
                {
                    lambdaResult = true;
                    break;
                }
            }
            return lambdaResult;
        };

        result = (from v in _entity.CAVouchers
                  join vs in _entity.CAVoucherStatus.Where(vs => (myIN(statuses, vs.VoucherStatusId) == true)) on v.VoucherStatusId equals vs.VoucherStatusId
                  join vsr in _entity.CAVoucherStatusReason on v.VoucherStatusReasonId equals vsr.VoucherStatusReasonid
                  where v.CyberAgent.CAID == caid                       
                  select new ACPVoucher() 
                  {
                      ...
                  }).ToList();

由于“where”条件,这引发了“LINQ to Entities”中不支持LINQ表达式节点类型'Invoke'错误。 基本上我需要的是“在[1,2,3]中的statusId”类型的条款。

什么失败?...有关如何做到这一点的任何提示?当应用于通用列表时,同样的方法对我有用。

由于

3 个答案:

答案 0 :(得分:3)

您可以执行包含查询:

where statuses.Contains(vs.VoucherStatusId)

答案 1 :(得分:1)

你能试试吗?

join vs in _entity.CAVoucherStatus.Where(vs => statuses.Contains(vs.VoucherStatusId)) on v.VoucherStatusId equals vs.VoucherStatusId

答案 2 :(得分:0)

不同的LINQ提供商支持不同的技巧;因为它发生LINQ-to-SQL与invoke一起使用。 EF:不是那么多。如果要手动构建表达式,则可能需要在不使用调用的情况下构建表达式,或者使用重写器来展平它。这里有一个重写器示例说明了如何执行此操作:Combining two lambda expressions in c#