Подтвердить что ты не робот

Entity framework Включить команду - левое или внутреннее соединение?

Когда я исследовал разницу между Include и Join, я обнаружил, что:

Если БД не включает внешние ключи - у него нет навигационных реквизитов, поэтому лучше использовать Join

Если у него есть навигационные реквизиты, используйте Include. (он также сохраняет удары db.)

Но один ответ здесь привлек мое внимание:

Include реализуется как соединение. В зависимости от допустимостивключенная ссылка - это внутреннее или левое соединение.

Вопрос:

Как недействительность влияет на левое/внутреннее соединение?

В сервере Sql у меня может быть таблица Cities и таблица Persons, и у человека может быть NULL CityID.

Почему ли сущность Framework решает для меня, что это за соединение?

изменить: визуализация:

enter image description here

enter image description here

Теперь измените значение CityId на null:

enter image description here

И вот это изменение:

enter image description here

4b9b3361

Ответ 1

Предположим, что в вашем классе существует ограничение [Required] для City или CityID. И предположим, что есть записи Лица без (действительного) Города. Единственный способ удовлетворить [Required] - выполнить внутреннее соединение.

Но до тех пор, пока ограничения в вашей комбинации Db и модели (т.е. CityID INT NOT NULL), не имеет значения, какой тип соединения используется. Это должен быть нормальный случай.

И без ограничения вы, конечно, ожидаете Left Join.

Ответ 2

Я знаю, что это старый вопрос, но если кто-то еще приземляется здесь, используя EF Code First, как и я, моя проблема заключалась в плавных сопоставлениях:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Parent>()
            .HasOptional(a => a.Child) /* LEFT OUTER JOIN */
            .WithMany()
            .HasForeignKey(a => a.ChildId);
    }

переводится как LEFT OUTER JOIN, тогда как

    modelBuilder.Entity<Parent>()
        .HasRequired(a => a.Child) /* INNER JOIN */
        .WithMany()
        .HasForeignKey(a => a.ChildId);

переводится как INNER JOIN.