Priya-Kiko Ответов: 1

Каков правильный способ построения запроса LINQ to entities


Привет,

Я пытаюсь получить часть столбца " код "и другой столбец "resnum" из моей модели с именем "tabl" в список типа "tabl". Вот я и сделал это :

List<tabl> lsttablmaster = null;

lsttablmaster = Context.tabls.Select(r => new tabl { code = r.code.Remove(r.code.Length - 1), resnum = r.resnum }).ToList();


Вышеизложенное приводит к ошибке :
"Сущность или сложный тип не могут быть построены в запросе LINQ to Entities"

Если добавлена функция AsEnumerable() :
lsttablmaster = Context.tabls.AsEnumerable().Select(r => new tabl { code = r.code.Remove(r.code.Length - 1), resnum = r.resnum }).ToList();


никакая ошибка.

Здесь я беспокоюсь, прочитав в интернете, что если используется AsEnumerable (), то вся таблица вытягивается в память перед применением условия. Поэтому я хочу спросить, Как правильно это сделать.

Каким образом функция AsEnumerable() изменяет сценарий. Пожалуйста, предложите или укажите правильное направление, чтобы прочитать больше. Заранее спасибо.

Что я уже пробовал:

Хотя несколько ссылок в Google указывают на одну и ту же ошибку :

The entity or complex type  cannot be constructed in a LINQ to Entities query

ничто не казалось более понятным новичку, как я, или я не сталкивался ни с одной такой ссылкой.

1 Ответов

Рейтинг:
5

Daniel Wosch

Это как-то связано с концепциями ссылочного и отложенного выполнения в LINQ.

Context.tabls.Select(r => new tabl { code = r.code.Remove(r.code.Length - 1), resnum = r.resnum })

Эта часть вернет a IQueryable<t> который выполняется только в тот момент, когда вы вызываете ToList() или перебираете результат IQUeryable, например, с помощью цикла foreach. В этом случае вы не можете сопоставить сущность с вашей моделью. Эф ограничивает это... Не знаю почему. Возможно, чтобы предотвратить обновление / изменение сущностей, пока результат не будет полностью запрошен или извлечен.

Пользуясь Методом asenumerable() запрос выполняется немедленно, и результат сохраняется в памяти.
После этого можно сопоставить сущности с вашей моделью / классом / объектом, так как полный результат запроса уже находится в памяти.

Это может помочь вам немного проникнуть внутрь упомянутого и отложенного выполнения в LINQ / Entity Framework.

С уважением.


Priya-Kiko

Спасибо за ваше время и подробное объяснение.