即使加入的行不存在,也使JOIN查询匹配

时间:2014-01-22 19:18:37

标签: c# linq join

假设我有表格InvoicesCustomers。所有发票都应该有客户,但并非所有发票都有。

我想选择所有发票并将其加入客户问题是,如果发票没有客户,那么该发票就不会显示在结果中。

我现在拥有的是:

var query = from inv in Db.Invoices                        
            join cust in Db.Customers on inv.IdCustomer equals cust.Id
            select new { Invoice=inv, Customer=cust };

如果发票有客户,该查询效果很好。 我如何选择一个空客户并仍然让查询返回所有发票以防万一找不到客户?我希望查询返回所有发票,如果客户在那里加入,否则返回我一个空客户。

我知道我可以做2个嵌套for循环,但我不认为那会有效率,而且当处理更多连接时会更糟糕。

2 个答案:

答案 0 :(得分:3)

您需要进行左连接

var query = from inv in Db.Invoices                        
            from cust in Db.Customers.Where(x => inv.IdCustomer == x.Id).DefaultIfEmpty()
            select new { Invoice = inv, Customer = cust };

答案 1 :(得分:1)

正如@Magnus所说,你需要离开加入。您可以使用join * in * on * equals * into pattern:

通过基于语法的查询来完成此操作
var query = from inv in Db.Invoices                        
            join c in Db.Customers on inv.IdCustomer equals c.Id into customers
            from cust in customers.DefaultIfEmpty()
            select new { Invoice = inv, Customer = cust };

在MSDN上描述:

  

左外连接是一个连接,其中返回第一个集合的每个元素,无论它是否在第二个集合中有任何相关元素。您可以使用LINQ通过对组连接的结果调用DefaultIfEmpty方法来执行左外连接。

     来自How to: Perform Left Outer Joins (C# Programming Guide)