【问题标题】:Expression Tree Multiple Entities表达式树多个实体
【发布时间】:2015-02-23 22:06:16
【问题描述】:

我正在使用 Linq to 实体和表达式树构建高级搜索功能。我有两个实体,实体 A 和实体 B,其中 A 是父级并且与 B 具有一对多关系。

我已完成实体 A 中字段的表达式树,并且 Linq 查询按预期工作。我要添加的是一项功能,我可以在其中查询以返回实体 B 中的字段包含一些文本的实体 A 记录。

我已经找到了足够多的提示,可以相当确定我可以做到这一点,但我正在尝试将它们全部整合到一棵树中,以便我可以累积过滤。所以我希望能够或多或少地说:

SELECT * 
FROM EntityA EA 
WHERE EA.FieldA = 'exampleinsql' 
AND 'test' in (SELECT EB.FieldB
               FROM EntityB EB 
               WHERE EntityB.EntityAForeignKey = EA.ID)

这有意义吗?

我目前正在做的是传递一个过滤器对象列表,然后使用下面的代码片段将一堆表达式组合在一起:

Expression expBody = ParseOperator(
        Expression.Property(pe, filtersList.FirstOrDefault().FieldName), 
        filtersList.FirstOrDefault().Operator, 
        Expression.Constant(filtersList.FirstOrDefault().GetTypedValue()));
expBody = Expression.AndAlso(expBody, newExp);

正如我所提到的,这对于主实体上的列非常有用。我的理解是,对于 EntityB,我需要创建一个 Lambda 表达式来添加它。我在正确的轨道上吗?有人有什么想法吗?

【问题讨论】:

  • 因此,在对此进行了额外研究之后,我意识到我正在重新发明轮子,并且已经完成了一半:petemontgomery.wordpress.com/2011/02/10/… 打算尝试一下,看看我是否可以让它发挥作用我需要的方式。

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


【解决方案1】:

您根本不需要操纵表达式。只需使用常规 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 进行这样的查询。

【讨论】:

  • 您需要在Where 之后进行选择才能调用Contains<string>
  • 我开始使用表达式树路径的原因是我试图让它在几个不同的实体中可重用。我不想在 linq 查询中包含多个 Where 以避免使其成为实体特定的。
  • @yanbu 让所有实体实现一个包含所有所需信息的接口,然后针对该接口编写查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多