2010-03-17 4 views
1

У меня есть следующий запрос LINQ, что мне нужно перевести Entity SQL/ESQL):Entity framework (3.5): Как перевести определенный запрос LINQ на eSQL?

return (ObjectQuery<User>) from user in Users 
    where !user.Roles.Any(r => r.AnIntegerProperty < 0) 
    select user; 

User.Roles является навигационным свойством к п: т отношение к ролям и там также является Role.Users навигационная собственность наоборот. В модели нет пользовательских ролей или объектов Roles_User, и я не могу их добавить.

Я также не могу использовать оператор LINQ здесь, потому что мне нужно добавить .OrderBy («это.» + Имя свойства) (исходит из другого источника, также не может его изменить), в дальнейшем это невозможно, если ObjectQuery создается с помощью linq.

Как я могу перевести это на eSQL? И где я могу найти хорошие образцы eSQL? Я искал целый день до сих пор и должен признать, что ссылка на eSQL отвратительна, и нет никаких примеров использования в Интернете.

+0

Я не понимаю «Я также не могу использовать оператор LINQ здесь, потому что мне нужно добавить .OrderBy ("it." + propertyname) ". QueryBuilder методы (например, 'OrderBy (« это. »+ ...' вы предлагаете) отлично работают с LINQ. Просто введите 'IQueryable ' в 'ObjectQuery ' и идите. –

+0

Я попробовал, но затем во время выполнения Я получаю эту ошибку: «Методы построителя запросов не поддерживаются для запросов LINQ to Entities». –

+0

Сначала вы должны сделать часть QB. –

ответ

1

В случае, если вы не нашли решение, это будет работать

SELECT VALUE u FROM YourDataContextEntities.Users AS u WHERE NOT EXISTS(SELECT r FROM u.Roles AS r WHERE r.AnyIntegerProperty < 0) 
0

Я думаю, что динамическая библиотека LINQ может быть решение здесь:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Вы можете создавать фильтрации выражений с использованием имен динамических свойств, поэтому нет необходимости делать переводы.

+0

Но динамических свойств не было, т? Как указано, имя .OrderBy («это.» + Имя) происходит из другого источника, и я не могу его изменить, и, кроме того, я не должен нарушать существующий внешний код, основанный на классах, в которых я сейчас работаю. –

+0

@Sebastian P.R. Gingter: '.OrderBy (« это. »+ Имя)' должен работать. Я не знаю, в чем проблема. – LukLed

+0

Не работает. Вы не можете использовать .OrderBy ("esqlStatement") в ObjectQuery, который был преобразован в код с помощью LINQ. Сообщение об ошибке, которое приходит во время выполнения: «Методы построения запросов не поддерживаются для запросов LINQ to Entities». Если я создаю ObjectQuery с помощью eSQL (с более простым заявлением, например, с пользователями старше 17), он работает.Поэтому мне нужно использовать eSQL для построения запроса, который я изложил, но я полностью застрял на этом. –

0

я бы написать что-то вроде

contexte.Users.Where("NOT EXISTS (SELECT VALUE r FROM it.Roles AS r WHERE r.AnIntegerProperty < 0)") 

не проверял, но я уже пытался что-то подобное, так Тхи должны работать для вас.

0

Трудно найти ответ, не зная специфики того, что доступно для пользователей и ролей. Однако, учитывая то, что вы сказали, будут выполнены следующие работы:

return (ObjectQuery<User>) from user in Users 
          where !(from role in dataContext.Roles 
            where role.AnIntegerProperty < 0 
            select role.UserId).Contains(user.UserId); 
Смежные вопросы