2010-10-18 3 views
2

Я работаю над EF с C# и WPF в качестве переднего конца. Мне нужно предоставить пользовательский интерфейс, чтобы пользователь мог создать свой собственный запрос и получить результат. Пользовательский интерфейс будет списком таблиц и списком столбцов для выбора (не нравится пользовательскому интерфейсу. Нужно улучшить, но новые тики в моем сознании).Как запустить SQL-запросы на EF?

Так что мой вопрос в том, как создавать, объединять (существующий запрос) и выполнять запросы.

Существует объект-провайдер Entity Client класса sql, класс objectquery. Я использовал ObjectQuery

string querystring = @"SELECT PrjDev FROM prjscenario"; 
ObjectQuery<PrjDev> prjdevquery = new ObjectQuery<PrjDev>(querystring, ptxobjcontext); 
string cpmmandtext = prjdevquery.CommandText; 
int prjdevnum = prjdevquery.Count(); 

Он работает. Но когда я запускаю сложный запрос. Это не работает. Пример кода:

string querystring = @"SELECT PrjDev FROM prjscenario WHERE PrjDev.PrjDevType = 10"; 

Ошибка:

'PrjDevType' не является членом «Transient.collection [Skm.Ptx.Data.Emf.PrjDev (Nullable = True, DefaultValue =)] ». Чтобы извлечь свойство коллекции элемент, используйте подзапрос для итерации над коллекцией. Рядом простой идентификатор, строка 1, столбец 45.

Любая идея, почему это хорошо для одного простого запроса, но она не работает для сложных запросов?

Спасибо заранее, N

ответ

11

В запросе передается в качестве параметра в ObjectQuery<T> конструктор не является запросом SQL, что это ESQL (Entity SQL) запросов. Хотя в синтаксисе они похожи, они очень разные языки. Вы можете узнать больше о ESQL on this page.

Если вы хотите выполнить реальный SQL с базой данных ObjectContext, вы можете использовать метод ObjectContext.ExecuteStoreQuery или просто восстановить соединение через свойство ObjectContext.Connection и написать там «классический» код ADO.NET.

+0

Привет, Томас, я смотрел ExecuteStoreQuery и E SQL. Первый ExecuteStoreQuery выглядит хорошо для меня. Он отлично работает с простым запросом. Но когда я передаю сложный запрос с объединением трех таблиц. Он ломается по ошибке, например, считыватель данных несовместим с указанным «Emf.PrjDevCable». Элемент типа «PrjDevID» не имеет соответствующего столбца в считывателе данных с тем же именем. –

+0

Он не будет работать для анонимных типов, только для именованных типов (поскольку вы не можете указать анонимный тип в качестве параметра типового типа). Запрос должен возвращать те же имена столбцов, что и в вашей модели. –

+0

Спасибо. Я решил проблему, пришел сюда, чтобы ответить, я вижу ваш пост. Я сделал то же самое. Я использовал Select Name, Type from Table Joins ..... Теперь я использую Select * From Table Join .... Короче говоря, L2S поддерживает оба. Но EMF хорошо работает только с Select * .... Спасибо, N –

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