【问题标题】:How to do a JOIN in EF when the join condition is a like当连接条件为like时如何在EF中进行JOIN
【发布时间】:2018-06-25 11:02:30
【问题描述】:

我有以下 SQL 查询,我想将其转换为 EF Linq 查询,但我不知道如何编写“like”部分。

SELECT DepartmentsWithChildren.*
FROM dbo.People
    INNER JOIN dbo.DepartmentPersons
        ON DepartmentPersons.Person_Id = People.Id
    INNER JOIN dbo.DepartmentsWithChildren
        ON DepartmentsWithChildren.lvl LIKE '%,' + CAST(DepartmentPersons.Department_Id AS VARCHAR(50)) + ',%'
WHERE UserId = '01cb89b4-9f81-4012-a4d9-5a38468a7433'

上述查询的示例结果

Id  ParentDepartmentId  lvl
58  27  ,27,3,1,
64  27  ,27,3,1,
67  27  ,27,3,1,
77  27  ,27,3,1,
90  27  ,27,3,1,
93  27  ,27,3,1,
100 27  ,27,3,1,
102 27  ,27,3,1,
106 27  ,27,3,1,
134 27  ,27,3,1,
137 27  ,27,3,1,
396 27  ,27,3,1,
414 27  ,27,3,1,
171 67  ,67,27,3,1,
206 67  ,67,27,3,1,
219 67  ,67,27,3,1,

为了澄清,我想知道如何做一个 JOIN 的 LIKE 部分,我知道在 WHERE 子句中我可以使用包含,但是对于 JOINS,我发现的每个示例都只使用相等,f.eks: How to join tables in EF LINQ

【问题讨论】:

  • ,67,27,3,1, 到底是什么意思? 数据库中的 CSV 数据通常是一件坏事。
  • lvl 由视图查询生成,是所有部门父部门的逗号分隔列表。所以在这个列表部门 171 中,有 4 个父部门 (67,27,3,1)
  • 另一种可能的方法是使用单独的表。我们称之为MultiLevelParents。它将包含三列 - IdAncestorDepartmentIdGeneration。而不是拥有67,27,3,1lvl 值,而是MultiLevelParents 中的四个值 - 第一个是171671,最后一个是1711 和@ 987654337@.
  • @mjwills 如果我愿意更改数据库,这是一种方法。我也可以简单地将上述查询用作视图并从中进行选择。我要问的是是否可以在 EF 中做到这一点
  • @lsma 我知道如何在 SQL 中执行此操作,但我真的不知道如何在 EF 中执行此操作,这就是为什么没有示例

标签: c# entity-framework tsql


【解决方案1】:

在 Linq 中使用 join 时只能使用等于运算符,下面是一种可能的解决方法。

假设你的 DbContext 被称为 db:

var result = from people in db.People
             from departmentWithChildren in db.DepartmentsWithChildren
             join departmentPerson in db.DepartmentPersons 
                             on people.Id equals departmentPerson.Person_Id
              where departmentWithChildren.Any(d => d.lvl.Contains("," + 
                             departmentPerson.Deparment_Id + ",")) &&
                             people.UserId = "01cb89b4-9f81-4012-a4d9-5a38468a7433"
              select departmentWithChildren;

【讨论】:

  • 问题是如何在连接中做到这一点,而不是如何编写类似查询。
  • 不,我问的是如何进行 LIKE JOIN,而不是 LIKE 查询
  • 最终完全放弃了 JOIN,只使用了 2 个 FROM 子句和 WHERE 子句,第二个引用第一个。我认为这在 EF 中被称为 LEFT OUTER JOIN
  • 是的,我也打算这样做,但它会产生一个效率稍低的查询。如果您没有数百万条记录也没关系;)谢谢。
【解决方案2】:

一个简单的好方法是使用两个 linq 查询。

var dict = from row in entities.departments where yada yada select row.Id;

var query = from row in entities.departmentpersons where
            dict.Contains(row.departmentId)
            select row;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多