表达式树多个实体

时间:2015-02-23 22:06:16

标签: c# linq entity-framework linq-to-entities expression-trees

我正在使用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表达式来添加它。我是在正确的轨道上吗?有人有任何想法吗?

1 个答案:

答案 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