我正在使用Linq到实体和表达式树构建高级搜索功能。我有两个实体,实体A和实体B,其中A是父实体,与B有一对多的关系。
我已完成实体A中字段的表达式树,Linq查询按预期工作。我试图添加的是一个功能,我可以查询返回实体B记录,其中实体B中的字段包含一些文本。
我已经找到足够的提示,相当确定我可以做到这一点,但我试图将它全部整理成一棵树,以便我可以累积过滤。所以我希望能够或多或少地说:
SELECT *
FROM EntityA EA
WHERE EA.FieldA = 'exampleinsql'
AND 'test' in (SELECT EB.FieldB
FROM EntityB EB
WHERE EntityB.EntityAForeignKey = EA.ID)
如果这有意义吗?
我目前正在做的是传递一个过滤器对象列表,然后使用下面的代码snippits将一堆表达式组合在一起:
Expression expBody = ParseOperator(
Expression.Property(pe, filtersList.FirstOrDefault().FieldName),
filtersList.FirstOrDefault().Operator,
Expression.Constant(filtersList.FirstOrDefault().GetTypedValue()));
expBody = Expression.AndAlso(expBody, newExp);
正如我所提到的,这适用于主要实体上的列。我的理解是,对于EntityB,我需要创建一个Lambda表达式来添加它。我是在正确的轨道上吗?有人有任何想法吗?
答案 0 :(得分:0)
您根本不需要操纵表达式。只需使用常规lambda来编写如下查询:
var query = from a in context.EntityA
where a.FieldA == "exampleinsql" &&
context.EntityB.Where(b => b.EntityAForeignKey == a.ID)
.Select(b => b.FieldB)
.Contains("test")
select a;
当然,您也可以为此类查询执行Join
。