2011-11-15 37 views
5

Ok vì vậy tôi đang cố gắng để có được tất cả các công ty được giao cho cả hai khóa học tồn tại trong một bảng ánh xạ khóa học.Có ai có thể giảm 3 câu lệnh LINQ thành SQL này thành một không?

Bảng ánh xạ khóa học có 2 khóa học FK, trỏ đến hai khóa học khác nhau trong cùng một bảng.

Mỗi khóa học có một gói và các công ty được chỉ định cho các gói.

Tôi đang cố gắng chọn tất cả các công ty được chỉ định cho cả hai nhóm từ cả hai khóa học.

Tôi đã có thể thực hiện việc này (Chỉnh sửa: dường như không, vì OR, bất kỳ ai cũng có thể sửa lỗi này không?) Bằng cách sử dụng 3 truy vấn LINQ khác nhau, nhưng tôi hy vọng có một cách để giảm thành một ngắn gọn và hiệu suất:

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(); 
+0

Dường như truy vấn cuối cùng của bạn sẽ nhận được các công ty được gán cho * hoặc * bó thay vì * cả hai * gói. – CAbbott

+0

@CAbbott Tôi nghĩ bạn nói đúng, có cách nào để sửa chữa nó? – BigOmega

Trả lời

3

Dưới đây là truy vấn của bạn đơn giản hóa:

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(); 

[cập nhật]:

đây là qu ery phù hợp với yêu cầu của bạn. Nó sẽ chỉ phù hợp với các công ty phù hợp với cả hai khóa học.

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(); 

Một điều: kể từ khi bạn có mối quan hệ sau: Courses.BundleId =>Bundles.BundleId =>CompanyBundles.BundleId, bạn thực sự có thể tham gia Courses-CompanyBundles và bỏ qua Bundles tham gia. Nhưng SQL có thể làm điều này anyway.

+0

woa bạn có thể chỉ cần chồng từ như thế? – BigOmega

+0

Ngoài ra, bạn có thể tinh chỉnh nó để nó chỉ chọn các công ty được gán cho cả hai trong số hai khóa học được ánh xạ? Tôi không chắc đó có phải là cách bạn có hay không, nhưng nếu tôi chỉ thay đổi || thành && Tôi không nhận được kết quả nào, điều này không đúng. – BigOmega

+0

LINQ là phép thuật! Có, bạn có thể xếp chồng 'from's (kết quả trong một cross-join), bạn cũng có thể đặt một' where' bất cứ nơi nào! –

2

Dưới đây là một thay đổi cho truy vấn cuối cùng của bạn để đảm bảo rằng bạn sẽ có được các công ty được đăng ký trong cả hai bó:

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

Đối với cách kết hợp các thắc mắc, bạn có thể nhìn vào Scott Rippey 's câu trả lời.

Các vấn đề liên quan