LINQ使用带有多个(4)或更多表的多个.join扩展

时间:2017-05-10 21:00:52

标签: c# sql-server asp.net-mvc linq join

我在使用数据库中的多个(4)表设置LINQ查询时遇到问题。我能够使用我正在学习的LINQ语法连接两个表而没有问题,但更多的是给我带来麻烦。我试图将下面的SQL查询转换为LINQ格式。

select count(distinct applicant)
from apps inner join
     stu_terms on applicant = student_id inner join
     acad_prog on apps_program = acad_program and st_acad_lvl = acad_lvl inner join
     application_statuses on apps_status = application_status
where st_active_cred >= 0 and apps_start_term = @term and
      apps_admit_status = @status and apps_stu_type = @type and
      application_code is not null

我是LINQ查询的新手,以及所有内容如何组合在一起,但这就是我想出的。这有点棘手,因为除了有4个表之外,where子句是从三个不同的表中拉出来的,我设置它的方式迫使我在查询中分散.Where()方法。见下文:

int num = db.apps.Distinct()
            .Join(db.application_statuses,
            a => a.apps_status,
            aa => aa.application_status,
            (a, aa) => new { apps = a, application_statuses = aa })
            .Where(j => j.apps.admit_status == status && j.apps.apps_stu_type == type && j.apps.apps_start_term == term && j.application_statuses.application_code != null)
                .Join(db.stu_terms,
                a => a.apps.applicant,
                st => st.student_id,
                (a, st) => new { apps = a, stu_terms = st })
                .Where(j => j.stu_terms.st_active_cred >= 0)
                    .Join(db.acad_prog,
                    a => a.apps.apps.apps_program,
                    ap => ap.acad_program,
                    (a, ap) => new { apps = a, acad_prog = ap })
                        .Join(db.stu_terms,
                        ap => ap.acad_prog.acad_lvl,
                        st => st.st_acad_lvl,
                        (ap, st) => new { acad_prog = ap, stu_terms = st }).Count();  

正如您所看到的,Where方法位于两个不同的位置,因为它只能查看这些位置中特定表的列。我看到的大多数问题都是因为我甚至不知道我是否正确地将这四张桌子加在一起。大多数这些东西对我来说仍然是新的(Distinct()方法的随机放置显示)

我很感激帮助。

2 个答案:

答案 0 :(得分:0)

非常很少在LINQ中使用Join()和数据库。相反,您只需导航导航属性。使用合适的模型,这很简单:

      var q = from a in apps
              where a.StuTerms.ActtiveCredits > 0
                 && a.StartTerm = startTerm
                 && a.ApplicationStatus.AdmitStatus = admitStatus
                 && a.StudentType = studentType
                 && a.application_code != null
              select a;

     var applicants = q.GroupBy(a => a.ApplicantId).Count();

大卫

答案 1 :(得分:0)

LINQ已经在您的域模型中加入(如果您使用的是Code-First,请记住ICollection)

因此您无需指定连接。它默认使用延迟加载,这意味着在使用它们时会自动创建连接(= call .ToList())。

EG。

db.Apps.Where(el => el.Students.Any(dl => dl.Type == 'Something')).ToList()

如果您想要更快的性能,可以使用Include进行预先加载。这从一开始就创建了连接。

db.Apps.Include(el => el.Students.Select(dl => dl.childOfStudents)) 

因为你是新人。您还应该知道所有查询都会被跟踪以进行更改,这会降低性能。

因此,如果您不需要更改+更新对象,请使用.AsNonQueryable()以获得更好的性能。

PS。你仍然可以使用SQL - > https://msdn.microsoft.com/en-us/library/jj592907(v=vs.113).aspx :)