Linq Query объединяет таблицу с объектом List <string>, чтобы найти любые строки, которых нет в таблице - PullRequest
1 голос
/ 28 июня 2019

У меня есть webAPI, который получает список объектов.В настоящее время эти данные передаются в хранимый процесс в качестве объекта таблицы данных, но, поскольку dataDump может содержать тысячи записей ResponseAPI, это оказывается немного медленным.

Итак, я начал изучать концепцию использования EF для загрузки, толкая все изменения за один раз, используя SaveChanges для контекста.

var dataDump = new List<ResponseAPI>
{
    new ResponseAPI
    {
        Id= "1000",
        Code = "C15",
        value = "1976"
    },
    new ResponseAPI
    {
        Id = "999",
        Code = "C14",
        value = "1976"
    }
};
var step2 = from l in dataDump
            join p in Plants on new { X1 = l.Code } equals new { X1 = p.Code }
            join ps in PlantTypes on new { X1 = l.Code, X2 = p.Id } equals new { X1 = ps.Code, X2= ps.Id}
            where ps.TypeName == "Daisy"
            select new {
                Code = l.Code,
                Id = p.Id
            };

Насколько я могускажите, этот код работает, ошибок не выдается.Я пытаюсь получить список идентификаторов из dataDump, которые в настоящее время не существуют в таблице Plants.

Я добился определенного успеха, используя другую технику, но только с одним соединением таблицы.

 var step1 = dataDump.Where(s => 
                            s.Code.Any(
                            a => !context.Plants
                            .Select(x => x.Code)
                                       .Contains(s.Code)))
                                       .Select(s => s.Code)
                                       .Distinct()
                                       .ToList();

Первый фрагмент "step2" просто выполняет базовое соединение между таблицами, и это работает, но я не уверен, как этого добиться!на соединениях.

Второй фрагмент "step1" не имеет!в контексте, который выполняет работу только по возврату значений из dataDump, которых нет в таблице Plants.

Моим предпочтительным методом будет step1, но я не делаю, как добавить второе соединение, связывающее дваполя.

1 Ответ

0 голосов
/ 28 июня 2019
var step1 = dataDump.Where(s => 

        s.Code.Any(a => !context.Plants.Select(x => x.Code).Contains(s.Code))

        &&

        s.Code.Any(a => !context.Plants.any(x => x.PlantTypes.Select(t => t.Code).Contains(s.Code)))

                        ).Select(s => s.Code).Distinct().ToList();

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

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