Entity Framework (3.5): Как перевести определенный запрос LINQ в eSQL?
У меня есть следующий запрос LINQ, который мне нужно перевести на Entity SQL / eSQL):
return (ObjectQuery<User>) from user in Users
where !user.Roles.Any(r => r.AnIntegerProperty < 0)
select user;
User.Roles - это свойство навигации в отношении n:m к ролям, а также есть свойство навигации Role.Users в обратном направлении. В модели нет доступных User_Roles или Roles_User Entities, и я не могу их добавить.
Я также не могу использовать оператор LINQ здесь, потому что мне нужно добавить.OrderBy("it." + Имя свойства) (исходит из другого источника, тоже не могу его изменить), что невозможно, если ObjectQuery собирается с linq.
Так как мне перевести это на eSQL? И где я могу найти хорошие образцы eSQL? Я искал целый день до сих пор и должен признать, что ссылки на eSQL паршивые и в Интернете нет примеров, которые можно было бы использовать.
4 ответа
Если вы не нашли решение, это будет работать
SELECT VALUE u FROM YourDataContextEntities.Users AS u WHERE NOT EXISTS(SELECT r FROM u.Roles AS r WHERE r.AnyIntegerProperty < 0)
Я написал бы что-то вроде
contexte.Users.Where("NOT EXISTS (SELECT VALUE r FROM it.Roles AS r WHERE r.AnIntegerProperty < 0)")
не проверял, но я уже пробовал нечто подобное, так что это должно работать для вас.
Трудно найти ответ, не зная специфики того, что доступно в разделе "Пользователи и роли". Однако, учитывая то, что вы сказали, будет работать следующее:
return (ObjectQuery<User>) from user in Users
where !(from role in dataContext.Roles
where role.AnIntegerProperty < 0
select role.UserId).Contains(user.UserId);
Я думаю, что динамическая библиотека linq может быть решением здесь:
Вы можете создавать фильтрующие выражения, используя динамические имена свойств, поэтому нет необходимости делать переводы.