【发布时间】:2017-05-10 21:00:51
【问题描述】:
我在使用我的数据库中的多个 (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() 方法的随机放置表明)
感谢您的帮助。
【问题讨论】:
-
如果您的查询如此复杂,请不要使用 linQ
-
这是什么? Linq2SQL 还是 EntityFramework?你的模型中有任何关系吗?
-
@fhogberg 这是实体框架。我不这么认为。这些表的列包含相似的数据,但彼此之间不是 FK。
-
这确实不是适合这项工作的工具。如果你不能改变模型。坚持使用 SQL。如果您的所有模型都像这样,请一起摆脱 EF 并改用 SqlCommand 。 EF只会给你带来痛苦。
-
@fhogberg 我开始意识到这一点。谢谢。
标签: c# sql-server asp.net-mvc linq join