使用多个From子句的LINQ连接

i2byvkas  于 2023-11-14  发布在  其他
关注(0)|答案(4)|浏览(166)

在C#中编写LINQ查询时,我知道可以使用join关键字执行连接,但下面的代码是做什么的呢?

from c in Companies
from e in c.Employees
select e;

字符串
我在一本LINQ的书中说这是一种连接,但不是一种正确的连接(使用了join关键字)。那么它到底是什么类型的连接呢?

qnyhuwrf

qnyhuwrf1#

多个“from”语句被认为是复合linq语句。它们就像嵌套的foreach语句。

var scoreQuery = from student in students
                 from score in student.Scores
                 where score > 90
                 select new { Last = student.LastName, score };

字符串
这句话可以改写为:

SomeDupCollection<string, decimal> nameScore = new SomeDupCollection<string, float>();
foreach(Student curStudent in students)
{
   foreach(Score curScore in curStudent.scores)
   {
      if (curScore > 90)
      {
         nameScore.Add(curStudent.LastName, curScore);
      }
   }
}

4c8rllxm

4c8rllxm2#

这将被转换为一个SelectMany()调用。它本质上是一个交叉连接。

// Query expression
from parent in adults
from child in parent.Children
where child.Gender == Gender.Male
select child.Name + " is a son of " + parent.Name

// Translation (using z for the transparent identifier)
adults.SelectMany(parent => parent.Children,
                  (parent, child) => new { parent, child })
      .Where(z => z.child.Gender == Gender.Male)
      .Select(z => z.child.Name + " is a son of " + z.parent.Name;

字符串
Jon Skeet在他的博客上谈到了这一点,作为Edulinq series的一部分。

tf7tbtn2

tf7tbtn23#

您列出的代码:

from c in company
from e in c.Employees
select e;

字符串
.将在company变量中生成每个公司的每个员工的列表。如果一个员工为两家公司工作,他们将被两次包含在列表中。
这里唯一可能发生的“join”是当您说c.Employees时。在SQL支持的提供程序中,这将转换为从Company表到Employee表的内部join。
然而,double-from结构通常用于手动执行“连接”,如下所示:

from c in companies
from e in employees
where c.CompanyId == e.CompanyId
select e;


这将与您发布的代码具有类似的效果,根据employees变量包含的内容,可能会有细微的差异。这也相当于以下join

from c in companies
join e in employees
   on c.CompanyId equals e.CompanyId
select e;


但是,如果您想要一个笛卡尔积,您可以删除where子句(为了使它有价值,您可能还想稍微修改select)。

from c in companies
from e in employees
select new {c, e};


最后一个查询将提供给予公司和雇员的所有可能的组合。

oogrdqng

oogrdqng4#

所有第一组对象将与所有第二组对象连接。例如,以下测试将通过...

[TestMethod()]
    public void TestJoin()
    {
        var list1 = new List<Object1>();
        var list2 = new List<Object2>();

        list1.Add(new Object1 { Prop1 = 1, Prop2 = "2" });
        list1.Add(new Object1 { Prop1 = 4, Prop2 = "2av" });
        list1.Add(new Object1 { Prop1 = 5, Prop2 = "2gks" });

        list2.Add(new Object2 { Prop1 = 3, Prop2 = "wq" });
        list2.Add(new Object2 { Prop1 = 9, Prop2 = "sdf" });

        var list = (from l1 in list1
                    from l2 in list2
                    select l1).ToList();

        Assert.AreEqual(6, list.Count);

    }

字符串

相关问题