Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 左加入林克?_C#_Linq_Linq To Sql - Fatal编程技术网

C# 左加入林克?

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

关于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 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|