C# 左加入林克?
关于Linq中的左连接,已经有很多问题了,我所看到的所有问题都使用C# 左加入林克?,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,关于Linq中的左连接,已经有很多问题了,我所看到的所有问题都使用join关键字来实现所需的目的 这对我来说没有意义。假设我有表Customer和Invoice,它们由Invoice上的外键CustomerID链接。现在我想运行一个包含客户信息和所有发票的报告。SQL将是: select c.*, i.* from Customer c left join Invoice i on c.ID = i.CustomerID 从我看到的答案来看,人们大多建议: var q = from c
join
关键字来实现所需的目的
这对我来说没有意义。假设我有表Customer
和Invoice
,它们由Invoice
上的外键CustomerID
链接。现在我想运行一个包含客户信息和所有发票的报告。SQL将是:
select c.*, i.*
from Customer c
left join Invoice i on c.ID = i.CustomerID
从我看到的答案来看,人们大多建议:
var q = from c in Customers
join i in Invoices.DefaultIfEmpty() on c.ID equals i.CustomerID
select new { c, i };
我真的不明白这怎么可能是唯一的办法。Customer
和Invoice
之间的关系已经由LinqToSQL类定义;为什么我必须对join
子句重复它?如果我想要一个内部连接,它应该是:
var q = from c in Customers
from i in c.Invoices
select new { c, i };
不指定连接的字段
我试过:
var q = from c in Customers
from i in c.Invoices.DefaultIfEmpty()
select new { c, i };
但这只是给了我同样的结果,好像它是一个内部连接
没有更好的方法吗?您可能需要使用“into”关键字
当关系已经定义(在数据库和.dbml标记中)时,运行时无法自动确定是否应该使用该关系 如果对象模型中有两种关系(Person有父对象和子对象,这两种关系都与其他Person实例有关),该怎么办。虽然案例可以是特殊案例,但这会使系统更加复杂(因此会有更多的bug)。请记住,在SQL中,您将重复关系的规范 请记住,索引和键是实现细节,而不是关系模型基础的关系代数的一部分 如果需要左外联接,则需要使用“
到”
”:
inv将有类型
IEnumerable
,可能没有实例。你在说什么?c.Invoice.DefaultIfEmpty()中的i的就是一个左连接
List<string> strings = new List<string>() { "Foo", "" };
var q = from s in strings
from c in s.DefaultIfEmpty()
select new { s, c };
foreach (var x in q)
{
Console.WriteLine("ValueOfStringIs|{0}| ValueOfCharIs|{1}|",
x.s,
(int)x.c);
}
谢谢,但这并不能真正回答我的问题。。。有没有更好的办法,利用关系已经确定的事实?+1回答得好,但你仍然没有抓住我的重点。发票明确定义了“客户”关系,我想利用这种关系:“c.发票”,而不仅仅是“发票”。有什么方法可以做到吗?@Shaul:那么就这样做吧,在表达式中使用c.发票。如果你想要一个不同的标识符,那么就使用let子句。好吧,让我失望吧——你是对的!现在,为什么我认为这不起作用。。。?好吧,我谦虚地退了下来。。。这个问题是我自己误解的结果。谢谢!:)
List<string> strings = new List<string>() { "Foo", "" };
var q = from s in strings
from c in s.DefaultIfEmpty()
select new { s, c };
foreach (var x in q)
{
Console.WriteLine("ValueOfStringIs|{0}| ValueOfCharIs|{1}|",
x.s,
(int)x.c);
}
ValueOfStringIs|Foo| ValueOfCharIs|70|
ValueOfStringIs|Foo| ValueOfCharIs|111|
ValueOfStringIs|Foo| ValueOfCharIs|111|
ValueOfStringIs|| ValueOfCharIs|0|