2015-09-25 34 views
0

目前我有两个表LINQ:列出所有当计数连接表等于零

1)的“工作”清单

+--------+-------------+ 
| job_id | job_name | 
+--------+-------------+ 
| 1234 | Test Job #1 | 
| 5678 | Test Job #2 | 
| 9101 | Test Job #3 | 
| 1475 | Test Job #4 | 
+--------+-------------+ 

2),涉及到每个“发票”的清单工作

| invoice_id | job_id | invoice_amount 
| 1    | 1234  | 950 
| 2    | 1234  | 120 
| 3    | 5678  | 560 

我需要找到一种方法来选择所有“工作”,他们没有一个“发票” - 所以最终预期的结果将是:

| job_id | job_name  | 
| 9101  | Test Job #3 | 
| 1475  | Test Job #4 | 

我想喜欢的东西:

SELECT * 
FROM jobs 
WHERE NOT EXISTS (
    SELECT * FROM invoices 
    WHERE jobs.job_id = invoices.invoice_id 
) 

而且仍然没有运气。 LINQ中如何实现这一点?任何帮助深表感谢!

+1

所以,你想要一个LINQ的解决方案?你的尝试在SQL – Jonesopolis

回答

2

的LINQ

var results = (from job in jobs 
       join invoice in invoices on job.job_id equals invoice.job_id into total 
       from record in total.DefaultIfEmpty() 
       where record == null 
       select job).ToList(); 

方法语法

群组加入是有点棘手,并在同一时间来得心应手。

该表展示了GroupJoin的工作方式。 (注:观察代码kg使用)

| Job Records (k) |Invoice Records (g) | 
+----------------------+--------------------+ 
| 1234 | Test Job #1 |{2 matching records}| 
| 5678 | Test Job #2 |{1 matching record} | 
| 9101 | Test Job #3 |{0 matching records}| 
| 1475 | Test Job #4 |{0 matching records}| 

最终代码

var result = jobs.GroupJoin(invoices,r=>r.job_id,c=>c.invoice_id, 
           (k,g) => new {k,g}) 
           .Where(x=>x.g.Count()==0) 
           .Select(s=> new {s.k.job_id,s.k.job_name}).ToList(); 
+0

如果它解释了这些步骤的作用,这个答案会更强。特别是GroupJoin可能会让Linq新手感到困惑。 –

+0

作品一种享受!谢谢! (同意Eric J的评论 - 虽然有点混乱) –

+0

@EricJ。 :同意你对GroupJoin的看法。补充说明! :) – DarkKnight

1

您可以使用一个内部的选择:

SELECT * FROM jobs 
WHERE job_id NOT IN (SELECT job_id FROM invoices);