LINQ или Lambda для двоих для петель - PullRequest
0 голосов
/ 21 апреля 2019

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

Я пытался сделать с LINQ, но один из них - это класс, а другой - просто строка [].Поэтому я не мог понять, как его использовать.

У меня есть Таблица имен документов в моей базе данных SQL и Файлы в папке содержимого.У меня есть два списка ListOfFileNamesSavedInTheDB и ListOfFileNamesInTheFolder.

По сути, я получаю все имена файлов, сохраненные в базе данных, и проверяю, существует ли он в папке, если не удаляю имя файла из базы данных.

 var clientDocList = documentRepository.Documents.Where(c => c.ClientID == clientID).ToList();

                 if (Directory.Exists(directoryPath))
            {
                string[] fileList = Directory.GetFiles(directoryPath).Select(Path.GetFileName).ToArray();


                foreach (var clientDoc in clientDocList)
                {
                    bool fileNotExist = true;
                    foreach (var file in fileList)
                    {
                        if (clientDoc.DocFileName.Trim().ToUpper()==file.ToUpper().Trim())
                        {
                            fileNotExist = false;
                            break;
                        }
                    }

                    if (fileNotExist)
                    {
                        documentRepository.Delete(clientDoc);

                    }
                }
            }

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

Вместо того, чтобы извлекать все документы из базы данных и выполнять проверку в памяти, я предлагаю проверить, какой документ не существует в папке в одном запросе:

if (Directory.Exists(directoryPath))
{
    var fileList = Directory.GetFiles(directoryPath).Select(Path.GetFileName);
    var clientDocList = documentRepository.Documents.Where(c => c.ClientID == clientID && !fileList.Contains(c.DocFileName.Trim())).ToList();
    documentRepository.Documents.RemoveRange(clientDocList);
}

Примечание: это просто пример для демонстрации идеи, где-то может быть синтаксическая ошибка, так как в данный момент у меня нет IDE. Но идея есть

Этот код не только короче, но и более эффективен, поскольку он использует только один запрос для извлечения документов из базы данных. Я предполагаю, что количество файлов в папке не слишком велико для преобразования в SQL с помощью EF

0 голосов
/ 21 апреля 2019

Я не совсем уверен, как вы хотите, чтобы ваш код работал, но я считаю, что вам нужно что-то вроде этого

        //string TextResult = "";
        ClientDocList documentRepository = GetClientDocList();
        var directoryPath = "";
        var clientID = 1;
        var clientDocList = documentRepository.Documents.Where(c => c.ClientID == clientID).ToList();

        if (Directory.Exists(directoryPath) || true) // I need to pass your condition
        {
            string[] files = new string[] { "file1", "file5", "file6" };  
            List<string> fileList = files.Select(x => x.Trim().ToUpper()).ToList(); // I like working with lists, if you want an array it's ok

            foreach (var clientDoc in clientDocList.Where(c => !fileList.Contains(c.DocFileName.Trim().ToUpper())))
            {
                //TextResult += $" {clientDoc.DocFileName} does not exists so you have to delete it from db";
                documentRepository.Delete(clientDoc);
            }

        }

        //Console.WriteLine(TextResult);

Если честно, мне действительно не нравится эта строка fileList = files.Select (x => x.Trim (). ToUpper ()). ToList () поэтому я бы предложил вам добавить вспомогательную функцию, сравнивающую список имен файлов с конкретным именем файла

        public static bool TrimContains(List<string> names, string name)
        {
            return names.Any(x => x.Trim().Equals(name.Trim(), StringComparison.InvariantCultureIgnoreCase));
        }

и ваш окончательный код станет

        List<string> fileList = new List<string>() { "file1", "file5", "file6" };

        foreach (var clientDoc in clientDocList.Where(c => !TrimContains(fileList, c.DocFileName)))
        {
            //TextResult += $" {clientDoc.DocFileName} does not exists so you have to delete it from db";
            documentRepository.Delete(clientDoc);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...