Entity Framework поддерживает только скалярные типы - PullRequest
2 голосов
/ 17 ноября 2010

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

ObjectQuery<Books> books = _ctx.Books.Include("Authors");

books = books.Where(book=>book.Vendor.Listing.Select(vend=>vend.Price > 200));

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

Так что я не могу сделать что-то вроде этого: -

var results = QueryCache.GetVendorFilter.Invoke(context,books);

, где GetVendorFilter - это скомпилированный запрос.

Есть ли другой способ получить этот запросбыть скомпилированным?Кто-нибудь знает, есть ли у EF4 это ограничение?

1 Ответ

1 голос
/ 17 ноября 2010

Насколько я понимаю, скомпилированный запрос в основном предварительно строит оператор SQL для вашего выражения запроса, но оставляет значения параметров неопределенными.Поскольку SQL не поддерживает использование другого запроса в качестве параметра, для меня имеет смысл, что вы не можете сделать это.

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

Поскольку ваш запрос books в значительной степени фиксирован, его легко создать.отдельный предварительно скомпилированный запрос для этого конкретного сценария.

...