为什么动态编写的LINQ操作中的参数导致错误

时间:2019-06-23 13:38:33

标签: c# linq entity-framework-core

我需要向LINQ表达式中添加动态数量的Join操作。该数字是DemHeaderIDs数组的大小。联接包括一个Where子句,该子句的参数取自DemoHeaderIDs数组。在第一组中使用DemoHeaderIDs[0]可以正常工作。但是当尝试在循环中使用DemoHeaderID[i]时,我收到以下错误消息。

当我使用硬编码的整数而不是DemoHeadersID[i]时,代码运行良好并且结果正确。

我的代码:

private void DoSomething(int[] DemoHeaderIDs, OVContext _context)
{   //first set of joins
    var q = from oh in _context.OrgHierarchy
            join odd in _context.OrgDemoData on oh.Identifier equals odd.Identifier
            join dh in _context.DemoHeader.Where(h => h.DemoHeaderId == DemoHeaderIDs[0]) on odd.Demoheaderid equals dh.DemoHeaderId
            select new
            {
                Name = odd.Demovalue,
                Parent = "All",
                Identifier = oh.Identifier
            };

    for (int i = 1; i < DemoHeaderIDs.Count(); i += 1)
    {   //dynamic joins
        q = from qObj in q
            join odd in _context.OrgDemoData on qObj.Identifier equals odd.Identifier
            join dh in _context.DemoHeader.Where(h => h.DemoHeaderId == DemoHeaderIDs[i]) on odd.Demoheaderid equals dh.DemoHeaderId
            select new
            {
                Name = odd.Demovalue,
                Parent = qObj.Name,
                Identifier = qObj.Identifier
            };
    }

    var ql = q.ToList();

错误消息:

  

System.IndexOutOfRangeException:索引超出了   数组。在lambda_method(Closure)在   Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.ParameterExtractingExpressionVisitor.Evaluate(Expression   表达式,String&parameterName)

在DbContext配置中添加EnableSensitiveDataLogging()不会在消息中添加信息。

我正在使用EntityFramework.Core 2.2。

1 个答案:

答案 0 :(得分:0)

确实做到了这一点:

添加了int Index=i;

,然后将DemoHeadersID[i]替换为DemoHeadersID[index]

你生活和学习。