Эффективный способ импорта данных с помощью linq в C # - PullRequest
0 голосов
/ 29 октября 2019

У меня есть коллекция некоторых объектов, и объекты принадлежат одному конкретному классу.

Теперь я хочу импортировать эту коллекцию с помощью Linq. Я знаю принцип импорта данных с помощью Linq.

У меня такой вопрос, когда я импортирую коллекцию объектов, которые представляют собой, например, две таблицы в базе данных, связанные с внешним ключом, и некоторые объекты затем будут использовать один и тот же внешний ключлучше ли для производительности и масштабирования сначала импортировать в одну таблицу, получить идентификатор из этого импорта обратно и обновить коллекцию на клиенте этим идентификатором или сохранить идентификатор из импортированных данных, например, в другой коллекции и всегда проверять его на наличиеследующий объект в Коллекции?

Или как лучше всего работать с Linq и Коллекцией, импортированной в несколько разных таблиц?

1 Ответ

0 голосов
/ 29 октября 2019

Вы писали:

, которые ... две таблицы в базе данных, связанные с внешним ключом

Это похоже на отношение: внешний ключ в одномТаблица ссылается на первичный ключ другой таблицы.

Например, школа со множеством учеников. Если ученик с первичным ключом [10] посещает школу с первичным ключом [8], то ученик [10] имеет внешний ключ SchoolId со значением [8]

Вы также написали:

... и некоторые Объекты затем будут использовать один и тот же внешний ключ

Это немного сбивает с толку. Кажется, вы имеете в виду, что элементы в этих двух таблицах имеют внешний ключ, который ссылается на один и тот же первичный ключ элемента в третьей таблице.

Например: если ученик [10] посещает школу[8] и учитель [25] преподает в школе [8], тогда и ученик, и учитель получат внешний ключ SchoolId со значением [8]

Ваш вопрос в том, что является более эффективным:извлечение данных из таблиц с использованием двух запросов и последующее их объединение, или позволить базе данных сделать это одним запросом.

Базы данных чрезвычайно оптимизированы для объединения записей из таблиц, особенно если эти записи ссылаются друг на друга с использованием стороннихключи. Одна из более медленных частей - передача данных запросов из системы управления базами данных в ваш локальный процесс.

Следовательно, целесообразно переносить только те свойства записей, которые вы фактически планируете использовать.

Теперь у вас, похоже, есть две таблицы, где все записи имеют внешний ключ, указывающий на первичный ключ элемента в третьей таблице, как в моем примере «Школы, учителя и ученики».

Обычно вы бызапросить школы, которые ...;каждая школа со своими учителями, которые ... и со своими учениками, которые ...;

Возможно, вы не хотите, чтобы все объекты принадлежали школам, учителям и ученикам. Кажется, вам не нужны какие-либо школьные свойства, только некоторые свойства учителей и свойства учеников.

Поскольку вы хотите сопоставить учеников, имеющих определенный SchoolId, с учителями, имеющими одинаковый SchoolId, было бы разумно неПередайте этот внешний ключ дважды: один раз для ученика школы [8] и один раз для учителя школы [8], поскольку они находятся в одной школе, вы знаете, что они будут иметь одинаковое значение.

Другойоптимизация: если у вас есть несколько учеников в школе [8] и несколько учителей в школе [8], почему бы не выполнить следующий запрос:

Дайте мне для всех школ, которые ..., первичный ключ(и, возможно, некоторые другие свойства), вместе со (некоторыми свойствами) всех Учеников, которые посещают эту Школу, и (некоторыми свойствами) всех Учителей, которые преподают в этой Школе

var results = dbContext.Schools
    .Select(school => new
    {
        Id = school.Id,
        Name = school.Name,        // only if you want other School properties
        ...

        // All Students that attend this School
        // == that have a foreign key equal to School.Id
        Students = dbContext.Students.Select(student => new
        {
            // Select only the properties that you plan to use
            Id = student.Id,
            Name = student.Name,
            ...

            // not needed: you know the value:
            // SchoolId = student.SchoolId,
        })
        .ToList(),

        // all Teachers that teach on this School
        // == that have a foreign key equal to School.Id
        // == that have a foreign key equal to the foreign key of all Students on this School
        Teachers = dbContext.Teachers.Select(teacher => new
        {
            // again: select only properties that you plan to use
            Id = teacher.Id,
            Name = teacher.Name,
            ...

            // not needed: you know the value:
            // SchoolId = teacher.SchoolId,

        })
        .ToList(),
    });

В результате, вы знаете, что в школе с идентификатором [8] будут все учащиеся, у которых есть внешний ключ со значением [8], и все учителя, у которых есть внешний ключ со значением [8]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...