gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:17:21 25 4
gpt4 key购买 nike

好的,所以我正在尝试让所有公司都分配到类(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com