C# 如何使用表达式树进行内部连接(筛选嵌套属性)?

C# 如何使用表达式树进行内部连接(筛选嵌套属性)?,c#,entity-framework,inner-join,expression-trees,C#,Entity Framework,Inner Join,Expression Trees,我的用户应该能够配置筛选器以从数据库中获取结果。 为了灵活处理查询,我决定使用表达式树。但我对表达式树有问题,无法通过引用代码进行过滤 实体: 泵启动 持续时间(时间跨度) DutDbId(Guid/FK) 时间戳(日期时间) DUT(被测设备) 被测设备 AdminId(字符串/唯一) DbId(Guid/PK) 引用代码(字符串) 创业公司(名单) 这里是等效linq中的一部分滤波器。但是我不能使用linq,因为我不知道用户将定义多少引用代码: //-----------------

我的用户应该能够配置筛选器以从数据库中获取结果。 为了灵活处理查询,我决定使用表达式树。但我对表达式树有问题,无法通过引用代码进行过滤

实体: 泵启动
  • 持续时间(时间跨度)

  • DutDbId(Guid/FK)

  • 时间戳(日期时间)

  • DUT(被测设备)

被测设备
  • AdminId(字符串/唯一)

  • DbId(Guid/PK)

  • 引用代码(字符串)

  • 创业公司(名单)

这里是等效linq中的一部分滤波器。但是我不能使用linq,因为我不知道用户将定义多少引用代码:

//-------------------reference code filter---------------------------
var query = context.PumpStartUps.Where((p => p.DUT.ReferenceCode == "HKR566" ||
                                             p.DUT.ReferenceCode == "HSH967" ||
                                             .
                                             .
                                             .));
startUps = query.ToList();
对于设备过滤,在过滤器的测试部分,我的解决方案是:

// --------------------duts filter-----------------------------------
Expression dutsExpression = null;
Expression psuExpression = Expression.Parameter(typeof(PumpStartUp), "psu");
Expression psuDutIdExpression = Expression.Property(psuExpression, "DutDbId");

foreach (var dut in filter.Duts)
{
    DeviceUnderTest deviceUnderTest = context.DevicesUnderTest.Where(d => d.AdminId == dut.Id).Single();
    Expression dutIdExpression = Expression.Constant(deviceUnderTest.DbId);
    Expression dutExpression = Expression.Equal(pumpStartUpDutIdExpression, dutIdExpression);
    if (dutsExpression == null)
    {
        dutsExpression = dutExpression;
    }
    else
    {
        dutsExpression = Expression.Or(dutsExpression, dutExpression);
    }
}
如何以这种方式按引用代码进行筛选:

使用以下方法:

var dutExpression = Expression.Property(psuExpression, "DUT");
var referenceCodeExp = = Expression.Property(dutExpression, "ReferenceCode ");
var constExpr = Expression.Constant("HKR566");
var eqExp = Expression.Equal(referenceCodeExp , constExpr);
dutsExpression = Expression.Or(dutsExpression, eqExp);

如果你的代码数量有限,你可以说

var query = context.PumpStartUps.Where(p => codes.Contains(p.DUT.ReferenceCode))

这将一直工作到大约2000个参数。如果您需要更多,那么您可能应该以某种方式将代码发送到临时表(或者更确切地说,是返回表的函数,因为ef不支持临时表),并在此基础上进行连接,因为使用2000多个ors构造表达式不会很好地执行。

请编辑标题,这不是内部连接,这个问题是关于什么,是为嵌套属性创建表达式。是,但生成的SQL将是联接。这不对吗?是的,将为每个导航属性生成一个联接查询。我认为现在的标题更好了。