В классе сущностей
У меня есть две родительские таблицы «TestParent» и «TestTag» в классе Entity и одна из дочерних таблиц. «TestChild», который не обновляется в классе Entity. поэтому я могу присоединиться к таблицам TestParent и TestChild (оба являются первичными отношениями foreinkey).
Проблема: я не могу выбрать дочернюю таблицу TestChild в запросе Linq
Таблица: TestTag:
Таблица: TestParent:
Детская таблица: TestChild
В классе Entity ниже
public DbSet<TestParent> Questions { get; set; }
public DbSet<TestTag> Tags { get; set; }
@BijayKoirala, извините, я обновил, пожалуйста, проверьте это
Еще одна вещь, ты забыл update TestChild, так как я не вижу, как TestTag, TestParent and TestChild связаны?
Пожалуйста, предположим, что в таблице TestChild -> TagId является первичным ключом таблицы TestParent. Я имею в виду, что таблица TestParent и TestChild дала отношение первичного ключа внешнего ключа. Таблица TestTag не имеет никакого отношения.
Тогда вы не сможете присоединиться к Linq. Если вы не планируете изменять класс сущностей, чтобы добавить TestChild, вы можете создать store procedure, где вы можете выполнить соединение и получить данные из кода, вызывающего sp.
Если я изменю отношение, например, в таблице TestChild, TagId является первичным ключом таблицы TestTag, а QuestionId является первичным ключом таблицы TestParent. Тогда возможно ли присоединиться к таблице TestChild в запросе Linq без добавления таблицы TestChild в класс Entity. Есть ли запрос на выборку в linq. Мне нужно выбрать записи из таблицы TestParent на основе TagId, значение которого я передаю в таблицу TestChild.
Давайте продолжить обсуждение в чате.





Итак, у вас есть три таблицы: таблица TestTags, таблица TestParents и таблица с TestChildren.
Каждый TestTag имеет ноль или более TestChildren; каждый TestChild принадлежит ровно одному TestTag с использованием внешнего ключа. Прямое отношение «один ко многим»
Каждый TestParent также имеет ноль или более TestChildren; каждый TestChild имеет ровно один TestParent, используя внешний ключ.
Если бы вы следовали Первые соглашения кода фреймворка сущностей, у вас было бы что-то похожее на
class TestTag
{
public int Id {get; set;}
... // other properties
// every TestTag has zero or more TestChildren (one-to-many)
public virtual ICollection<TestChild> TestChildren {get; set;}
}
class TestParent
{
public int Id {get; set;}
... // other properties
// every TestParent has zero or more TestChildren (one-to-many)
public virtual ICollection<TestChild> TestChildren {get; set;}
}
class TestChild
{
public int Id {get; set;}
... // other properties
// every TestChild has exactly one TestParent using foreign key
public int TestParentId {get; set;}
public virtual TestParent TestParent {get; set;}
// every TestChild has exactly one TestTag using foreign key
public int TestTagId {get; set;}
public virtual TestTag TestTag {get; set;}
}
In entity framework the columns of the tables are represented by non-virtual properties. The virtual properties represent the relations between the tables (one-to-many, many-to-many, ...)
Таким образом, TestTag 4 и TestParent 5 могут иметь двух дочерних элементов. Если вы не хотите, рассмотрите возможность создания комбинированного первичного ключа [TestTagId, TestParentId].
Если TestChild не имеет других свойств, кроме внешних ключей, то на самом деле вы создаете отношение «многие ко многим» между TestTag и TestParent. В этом случае вам не нужно упоминать таблицу TestChild.
Для полноты DbContext:
class MyDbContext : DbContext
{
public DbSet<TestTag> TestTags {get; set;}
public DbSet<TestParent> TestParents {get; set;}
public DbSet<TestChild> TestChildren {get; set;}
}
Это все, что необходимо знать инфраструктуре сущностей для обнаружения ваших отношений, а также первичных и внешних ключей. Поскольку я следовал условным атрибутам, свободный API не нужен, за исключением, может быть, из-за нестандартной формы множественного числа Children.
so can I Join the TestParent and TestChild table
Ну, вы можете присоединиться к (группе), но обычно проще использовать ICollections
Дайте мне TestParents, которые... со всеми их TestChildren и TestTags, которые...
var result = dbContext.TestParents
.Where(parent => ...) // if you don't want all testParents
.Select(parent => new
{
// select only the properties you plan to use
Id = parent.Id,
Name = parent.Name,
Children = parent.TestChildren
.Where(child => child.TestTag.Name = "My Test Tag Name")
.Select(child => new
{
Name = child.TestTag.Name,
...
})
.ToList(),
});
Некоторые люди вместо этого предпочитают использовать GroupJoin. Если вы этого хотите и можете убедить руководителя проекта в том, что GroupJoin удобнее для чтения/тестирования/сопровождения, чем использование ICollections, вы можете сделать следующее:
var result = dbContext.TestParents.GroupJoin(dbContext.TestChildren,
parent => parent.Id, // from each parent take the Id
child => child.ParentId, // from each child take the ParentId
// resultSelector:
(parent, children) => new
{
// Parent Properties:
Id = parent.Id,
...
// GroupJoin the collection of child properties with the TestTags:
children.GroupJoin(dbContext.TestTags,
child => child.TestTagId, // from each TestChild take the TestTagId
tag => tag.Id, // from each TestTag take the Id
(child, tagsOfThisChild) => new
{
// desired Child properties
...
TestTags = tagsOfThisChild.Select(tag => new
{
Id = tag.Id,
...
})
.ToList(),
})
.ToList(),
});
ИМХО: выглядит ужасно!
Мне нужно только вернуть записи таблицы «TestParents» на основе TagId таблицы «TestChild». Я буду передавать "tagId"
<Вопрос> связан с
TestParent? Если нет, укажитеTestParentКласс сущности? Также я не вижу никакой связи междуTestParentиTestChild.