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)
- 引用代码(字符串)
- 创业公司(名单)
//-------------------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将是联接。这不对吗?是的,将为每个导航属性生成一个联接查询。我认为现在的标题更好了。