我需要使用 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 查询。我该如何去做我想做的事?
答案 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 函数,除非您必须这样做,否则不推荐使用。