2012-03-05 3 views
0

Возможно ли выполнить скалярный запрос с использованием EF 4.1?Могу ли я выполнить скалярный запрос в EF 4.1?

Я пробовал:

 ObjectQuery<int> query = new ObjectQuery<int>("select count(*) from myTable", _context); 
    var result = query.Execute(MergeOption.NoTracking); 
    return result.FirstOrDefault(); 

но она возвращает ошибку: The query syntax is not valid. Near term '*'

Это единственный способ, чтобы выполнить запрос скалярного вызвать хранимый прок?

ответ

1

Мне кажется, что вы думаете об объектной структуре как «ADO.net 2.0», а не о ORM, которой она является.

Вместо того, чтобы использовать его для выполнения SQL-запросов, я бы рекомендовал использовать стандартный контейнер данных объектов и использовать запрос LINQ, как это предусмотрено в инфраструктуре сущности. Тогда это было просто что-то вроде

myDataContainerInstance.myTable.Count() 

ObjectQuery не аналогична команде ADO.NET и не выполнять операторы SQL. Вместо этого он используется для непосредственного определения запросов к объектной модели. (*) Недействителен, потому что это не SQL.

+0

Ну, это был всего лишь пример - мне нужно выполнить сложное объединение нескольких таблиц, включая пару карт «много-ко-многим», и подумал, что было бы проще и, вероятно, более эффективно выполнять запрос напрямую. – chris

+0

@chris У вас есть два варианта. Вы можете либо написать запрос LINQ, который выполняет соединения соответствующим образом (желательно без ключевого слова join, используя неявные объединения, поддерживаемые в LINQ), либо написать сохраненную процедуру proc. Если вы просто присоединяетесь к нескольким таблицам (многие из многих карт не выдерживают), возможно, вы создадите довольно эффективный запрос в LINQ. Если нужны временные таблицы, логика или просто тонкая настройка запроса, то сохраненный процесс будет вашим лучшим выбором. – Devin

Смежные вопросы