在获取查询结果之前,是否可以组合 2 个 LINQ 查询,每个查询都过滤数据?

时间:2021-01-21 16:09:14

标签: c# linq

我需要使用 LINQ 从 2 个 SQL 表中检索数据。我希望使用 Join 将它们结合起来。我在 Stack Overflow 上查过这个问题,但我看到的所有问题和答案都涉及使用 ToList() 检索数据,但我需要使用延迟加载。这样做的原因是数据太多,无法全部获取。因此,在执行 ToList() 之前,我必须对两个查询应用过滤器。

很容易指定其中一个查询:

var solutions = ctx.Solutions.Where(s => s.SolutionNumber.Substring(0, 2) == yearsToConsider.PreviousYear || s.SolutionNumber.Substring(0, 2) == yearsToConsider.CurrentYear);

它从 Solution 表中检索所有数据,其中 SolutionNumber 以当前或上一年开头。它返回一个 IQueryable。

我很难弄清楚如何从另一个名为 Proficiency 的表中检索过滤列表。在这一点上,我所拥有的是:

var profs = ctx.Proficiencies;

Proficiency 表有一个名为 SolutionID 的列,它是 Solution 表中 ID 列的外键。如果我在 SQL 中执行此操作,我会执行一个子查询,其中 SolutionID 位于 Solution 表中的 ID 集合中,其中这些 Solution 记录与我用来检索上述解决方案的 IQueryable 相同的 Where 子句匹配。只有当我指定了两个 IQueryables 时,我才想要执行 ToList()。

但我不知道如何为 Proficiency 指定第二个 LINQ 查询。我该如何去做我想做的事?

1 个答案:

答案 0 :(得分:1)

据我所知,您正在尝试根据一些解决方案获取熟练程度。这可以通过两种不同的方式实现。我将尝试在 Linq 中提供解决方案,因为它更具可读性。但是,您可以稍后在 Lambda 表达式中更改它们。

解决方案 1

var solutions = ctx.Solutions
               .Where(s => s.SolutionNumber.Substring(0, 2) == yearsToConsider.PreviousYear || s.SolutionNumber.Substring(0, 2) == yearsToConsider.CurrentYear)
               .Select(q => q.SolutionId);

var profs = (from prof in ctx.Proficiencies where (from sol in solutions select sol).Contains(prof.SolutionID) select prof).ToList();

解决方案 2

   var profs = (from prof in ctx.Proficiencies 
                 join sol in ctx.Solutions on prof.SolutionId equals sol.Id 
                 where sol.SolutionNumber.Substring(0, 2) == yearsToConsider.PreviousYear || sol.SolutionNumber.Substring(0, 2) == yearsToConsider.CurrentYear
                 select prof).Distinct().ToList();

您可以在 SQL Profiler 中跟踪这两个查询以调查生成的查询。但我会选择第一个解决方案,因为它会生成一个更快的子查询,并且不使用 Distinct 函数,除非您必须这样做,否则不推荐使用。