Внутреннее объединение LINQ по сравнению с лево-соединением

Данные относятся к данным Private vs Public collage, но они работают, поскольку мы можем видеть, что мы загружаем все глобальные параметры в объект морского обихода, а затем сопоставляем диаграммы с одной и той же панелью.

import seaborn as sns

import matplotlib.pyplot as plt

import pandas as pd


df = pd.read_csv('College_Data',index_col=0)

g = sns.FacetGrid(df,hue='Private',palette='coolwarm',size=6,aspect=2)

g.map(plt.hist,'Outstate',bins=20,alpha=0.7)

См. диаграмму

42
задан Guy 8 February 2009 в 15:21
поделиться

5 ответов

Я думаю, хотите ли Вы использовать дополнительные методы, необходимо использовать GroupJoin

var query =
    people.GroupJoin(pets,
                     person => person,
                     pet => pet.Owner,
                     (person, petCollection) =>
                        new { OwnerName = person.Name,
                              Pet = PetCollection.Select( p => p.Name )
                                                 .DefaultIfEmpty() }
                    ).ToList();

, который Вам, вероятно, придется играть вокруг с выражением выбора. Я не уверен, что это дало бы Вам, хотят Вас, хотят в случае, где у Вас есть 1-many отношения.

я думаю, что это немного легче с синтаксисом Запроса LINQ

var query = (from person in context.People
             join pet in context.Pets on person equals pet.Owner
             into tempPets
             from pets in tempPets.DefaultIfEmpty()
             select new { OwnerName = person.Name, Pet = pets.Name })
            .ToList();
75
ответ дан tvanfosson 23 September 2019 в 13:34
поделиться

Вот хорошее сообщение в блоге, это было просто отправлено Fabrice (автор LINQ в Действии), который покрывает материал в вопросе, который я задал. Я помещаю его здесь для ссылки, поскольку читатели вопроса найдут это полезным.

Преобразование LINQ запрашивает от синтаксиса запроса до метода/синтаксиса оператора

3
ответ дан Guy 23 September 2019 в 13:34
поделиться

Необходимо получить объекты, к которым присоединяются, в набор и затем применить DefaultIfEmpty как сказанный JPunyon:

Person magnus = new Person { Name = "Hedlund, Magnus" };
Person terry = new Person { Name = "Adams, Terry" };
Person charlotte = new Person { Name = "Weiss, Charlotte" };

Pet barley = new Pet { Name = "Barley", Owner = terry };
List<Person> people = new List<Person> { magnus, terry, charlotte };
List<Pet> pets = new List<Pet>{barley};

var results =
    from person in people
    join pet in pets on person.Name equals pet.Owner.Name into ownedPets
    from ownedPet in ownedPets.DefaultIfEmpty(new Pet())
    orderby person.Name
    select new { OwnerName = person.Name, ownedPet.Name };


foreach (var item in results)
{
    Console.WriteLine(
        String.Format("{0,-25} has {1}", item.OwnerName, item.Name ) );
}

Выводы:

Adams, Terry              has Barley
Hedlund, Magnus           has
Weiss, Charlotte          has
17
ответ дан Gishu 23 September 2019 в 13:34
поделиться

Я следующее сообщение об ошибке при направлении эта та же проблема:

тип одного из выражений в пункте соединения является неправильным. Вывод типа перестал работать в вызове к 'GroupJoin'.

Решенный, когда я использовал то же имя свойства, оно работало.

(...)

join enderecoST in db.PessoaEnderecos on 
    new 
      {  
         CD_PESSOA          = nf.CD_PESSOA_ST, 
         CD_ENDERECO_PESSOA = nf.CD_ENDERECO_PESSOA_ST 
      } equals 
    new 
    { 
         enderecoST.CD_PESSOA, 
         enderecoST.CD_ENDERECO_PESSOA 
    } into eST

(...)

5
ответ дан João Vieira 23 September 2019 в 13:34
поделиться

Оставленный участвует в LINQ, возможны с DefaultIfEmpty () метод. У меня нет точного синтаксиса для Вашего случая хотя...

На самом деле я думаю, изменяете ли Вы просто домашних животных на домашних животных. DefaultIfEmpty () в запросе это могло бы работать...

РЕДАКТИРОВАНИЕ: Я действительно не должен отвечать на вещи когда его последнее...

2
ответ дан Jason Punyon 23 September 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: