#c# #entity-framework #entity-framework-4
#c# #entity-framework #entity-framework-4
Вопрос:
Как я могу использовать приведение в Linq для сущностей?
Мне нужно что-то вроде этого:
if (typeof(myObject) is IMyInterface)
{
return MyObjectSet.Where(x => ((IMyInterface)x).MyProperty == 1);
}
Если я попробую приведенный выше код, я получу исключение. Это ожидаемое поведение EF или это ошибка?
Комментарии:
1. Я предполагаю, что это в каком-то общем контексте репозитория, где общий тип еще не определен, потому что ObjectSet сам по себе является общим, поэтому, если общий тип определен, вам не нужно приведение? В этом случае возможно ли наложить ограничение на универсальный тип ala
Repository<T> where T : IMyInterface
2. Это невозможно, поскольку мой универсальный репозиторий должен работать с классами, которые реализуют мой интерфейс, и с классами, которые его не реализуют.
Ответ №1:
Это ожидаемо. Поскольку вашего интерфейса нет в вашем EDMX, EF не знает, как отобразить его в запросе L2E. Трудно предложить хороший обходной путь, не зная, какую проблему вы пытаетесь решить.
Комментарии:
1. Это база данных с несколькими клиентами. Некоторые данные будут доступны всем клиентам. И другие будут частными только для 1 клиента. Я планирую реализовать интерфейс, который сообщает репозиторию, что этот класс является частным, и репозиторий «прикрепит» фильтр. С помощью этого я удалю ошибку разработчика, и нам просто нужно будет реализовать этот интерфейс. Извините за мой плохой английский.
2. Это будет трудно сделать хорошо. Вы можете ограничить результаты, возвращаемые из вашего репозитория, но если у них есть свойства навигации / ассоциации, клиент может перейти по ним к «частным» данным. Я не думаю, что для этого есть «общее» решение. Я думаю, что вопросы конфиденциальности необходимо решать тщательно и в каждом конкретном случае. Поместить личные данные в базу данных всегда сложно, чтобы добиться успеха.