c# - 任何人都可以将这 3 个 LINQ to SQL 语句缩减为一个吗?

标签 c# linq-to-sql

好的,所以我正在尝试让所有公司都分配到类(class)映射表中存在的两个类(class)。

类(class)映射表有 2 个 FK CourseID,指向同一张表中的两个不同类(class)。

每个类(class)都有一个 bundle,公司被分配到 bundle。

我正在尝试从两个类(class)中选择分配给两个 bundle 的所有公司。

我已经能够使用 3 个不同的 LINQ 查询来做到这一点(编辑:显然不能,因为 OR,任何人都可以解决这个问题吗?),但我希望有一种方法可以将它简化为一个以求简洁和性能:

Bundle vegasBundle = (from cm in db.VegasToPegasusCourseMaps
                                   join c in db.Courses on cm.VegasCourseID equals c.CourseID
                                   join b in db.Bundles on c.BundleID equals b.BundleID
                                   where cm.VPCMapID == CourseMapID
                                   select b).FirstOrDefault();

Bundle pegasusBundle = (from cm in db.VegasToPegasusCourseMaps
                                    join c in db.Courses on cm.PegasusCourseID equals c.CourseID
                                    join b in db.Bundles on c.BundleID equals b.BundleID
                                    where cm.VPCMapID == CourseMapID
                                    select b).FirstOrDefault();

IQueryable<Company> companyAssigned = from cb in db.CompanyBundles
                                      join c in db.Companies on cb.CompanyID equals c.CompanyID
                                      where cb.BundleID == vegasBundle.BundleID || cb.BundleID == pegasusBundle.BundleID
                                      select c;

return companyAssigned.ToList();

最佳答案

这是您的简化查询:

return (
    from cm in db.VegasToPegasusCourseMaps
      join cv in db.Courses on cm.VegasCourseID equals cv.CourseID
      join bv in db.Bundles on cv.BundleID equals bv.BundleID        // vegasBundle

      join cp in db.Courses on cm.PegasusCourseID equals cp.CourseID
      join bp in db.Bundles on cp.BundleID equals bp.BundleID        // pegasusBundle

    from cb in db.CompanyBundles                                     // OR-Join must be in the where clause
      join c in db.Companies on cb.CompanyID equals c.CompanyID

    where cm.VPCMapID == CourseMapID 
      && (cb.BundleID == bv.BundleID || cb.BundleID == bp.BundleID)
    select c
    ).ToList();

[更新]:

这是符合您要求的查询。它只会匹配匹配这两个类(class)的公司。

return (
    from cm in db.VegasToPegasusCourseMaps

    join cv in db.Courses on cm.VegasCourseID equals cv.CourseID
    join bv in db.Bundles on cv.BundleID equals bv.BundleID        // vegasBundle
    join cbv in db.CompanyBundles on bv.BundleId equals cbv.BundleId
    join cv in db.Companies on cbv.CompanyID equals cv.CompanyID

    join cp in db.Courses on cm.PegasusCourseID equals cp.CourseID
    join bp in db.Bundles on cp.BundleID equals bp.BundleID        // pegasusBundle
    join cbp in db.CompanyBundles on bp.BundleId equals cbp.BundleId
    join cp in db.Companies on cbp.CompanyID equals cp.CompanyID

    where cm.VPCMapID == CourseMapID 
        && cv.CompanyID == cp.CompanyID
    select cv
).ToList();

另一件事:因为你有以下关系:Courses.BundleId => Bundles.BundleId => CompanyBundles.BundleId,你可以实际上将 Courses 加入到 CompanyBundles 并跳过 Bundles 加入。但无论如何,SQL 可能都会这样做。

关于c# - 任何人都可以将这 3 个 LINQ to SQL 语句缩减为一个吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8142996/

相关文章:

c# - 如何在 LINQ 中实现动态 'where' 子句?

c# - Linq-To-Sql 查询中的模糊调用

c# - 为什么GC搞不定?

c# - 我如何声明具有不同类型和未知类型的泛型列表以及如何使用仅在运行时已知的类型初始化泛型?

c# - 使用阶段优先方法报告线程进度

c# - LINQ 到 SQL : intermittent AccessViolationException wrapped in TargetInvocationException

sql-server - Linq to SQL 审计跟踪/审计日志 : should I use triggers or doddleaudit?

c# - 使用 CsvHelper 将 CSV 中的所有值读入列表

c# - C# 中的异步修饰符

linq-to-sql - 使用 Entity Framework 或 Linq2SQL 从存储在 VarChar 中的 UTF-8 获取正确输出?