другой вариант вместо использования AsEnumerable () в linq EF, при использовании пользовательского метода в linq - PullRequest
0 голосов
/ 19 октября 2019

другая опция вместо использования AsEnumerable () в linq EF, при использовании пользовательского метода в linq

у меня есть код ниже

class Program
    {
        static void Main(string[] args)
        {
            string keyword = "m";
            using (TestingEntities1 db = new TestingEntities1())
            {
                var models = db.Teachers.AsEnumerable().Where(a => RemoveA(a.Name).Contains(keyword));
                foreach (var item in models)
                {
                    Console.WriteLine(item.Name);
                }
            }
        }
        static string RemoveA(string input)
        {
            return input.Replace('a', ' ');
        }
    }

, как вы можете видеть в моем коде, я должен использовать AsEnumerable() использование пользовательской функции работает, потому что, если я ее не использую, я получу что-то сообщение об ошибке «LINQ to Entities не распознает метод метода», и этот метод не может быть преобразован в выражение хранилища. «

изатем я понял, что asenumerable замедляет работу, потому что обнаружил, что здесь Как улучшить производительность AsEnumerable в EF говорит: «вы делаете, что вы загружаете целые таблицы BilBillMasters и BilBillDetails, а затем выполняете некоторую обработку этихв вашем приложении, а не на сервере SQL. Это должно быть медленно. "пожалуйста, обратитесь к первому ответу для получения более подробной информации, поэтому есть ли способ ускорить мой код, в моем случае у меня в базе данных более миллиона данных

1 Ответ

2 голосов
/ 19 октября 2019

Entity Framework необходимо преобразовать ваш запрос в запрос SQL, а это значит, что он должен знать, как преобразовать каждую его часть в SQL. Ваш запрос содержит вызов функции RemoveA, с которой Entity Framework не знает, как справиться. Вы можете решить эту проблему, преобразовав свой код в

class Program
{
    static void Main(string[] args)
    {
        string keyword = "m";
        using (TestingEntities1 db = new TestingEntities1())
        {
            var models = db.Teachers.Where(a => a.Name.Replace("a", " ").Contains(keyword));
            foreach (var item in models)
            {
                Console.WriteLine(item.Name);
            }
        }
    }
}

См. эту страницу MSDN , для функций которой вы можете использовать inline в запросе LINQ to Entities.

В качестве альтернативы,другой вариант - преобразовать вашу функцию в выражение , которое может понять Entity Framework. Пример этого можно увидеть в этом ответе StackOverflow .

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