C# Linq Inner Join

后端 未结 3 1108
梦如初夏
梦如初夏 2021-01-11 18:20

I want to select the persons only who are having pets.

when I execute the query

var query = from p in people
                        join
                   


        
相关标签:
3条回答
  • 2021-01-11 18:42

    Here's a different way to do it, adding only one line:

    var query = from p in people
                join pts in pets
                on p equals pts.Owner into grp
                where grp.Any()             // <--- added this
                select new {grp=grp,PersonName=p.FirstName};
    

    Here I select the groups, as you do, but I added one line that selects only the groups that contain at least one element, and ignore the rest.

    0 讨论(0)
  • 2021-01-11 18:44

    That's because you're using join ... into which does a group join. You just want a normal join:

    var query = (from p in people
                 join pts in pets on p equals pts.Owner
                 select p).Distinct();
    

    Alternatively, if you want the people with pets, and their owners, you could do something like:

    var query = pets.GroupBy(pet => pet.Owner)
                    .Select(x => new { Owner = x.Key, Pets = x.ToList() });
    

    That will give a result where you can get each owner and their pets, but only for people who have pets.

    If you want something else, let us know...

    By the way, now would be a good time to learn about object and collection initializers. Here's a simpler way to initialize your people list, for example:

    List<Person> people = new List<Person>
    {
        new Person { FirstName = "Jon", LastName = "Skeet" },
        new Person { FirstName = "Marc", LastName = "Gravell" },
        new Person { FirstName = "Alex", LastName = "Grover" },
    };
    

    Much more compact :)

    EDIT: A cross join is easy:

    var query = from person in people
                from pet in pets
                select new { person, pet };
    

    Left joins are effectively emulated using group joins. As it sounds like you've got C# in Depth, I suggest you read chapter 11 thoroughly :)

    0 讨论(0)
  • 2021-01-11 18:45

    this can also be done using lambda expressions in a single line of code...

    IEnumerable<Person> peopleWithPets = people.Where(x => pets.Any(y => y.Owner == x));
    
    0 讨论(0)
提交回复
热议问题