Как отфильтровать определенное условие по определенному подтипу объекта унаследованной сущности в запросе? - PullRequest
0 голосов
/ 18 января 2011

В моей базе данных SQL 2008 есть три таблицы: User, CutomerUser и SalesUser. Они представляют разные типы пользователей. В моей концептуальной модели они смоделированы так, что сущности CustomerUser и SalesUser наследуются от User. На уровне базы данных CustomerUser и SalesUser имеют свои первичные ключи, которые в то же время являются внешним ключом для пользователя. Таким образом, отношение один к нулю или один.

Таблица CustomerUser имеет столбец CustomerNumber, а таблица SalesUser имеет столбец ПредставительКод. Я хочу написать запрос, который возвращает данные о пользователях, клиентах или продавцах на основе критериев выбора. Обратите внимание, что есть пользователи, которые не являются ни CustomerUsers, ни SalesUsers.

Я не хочу возвращать всех пользователей, чей логин равен указанной строке, независимо от типа. Кроме того, если у CustomerUser есть номер клиента, равный указанной строке, я хочу его вернуть, и аналогичным образом я хочу вернуть SalesUsers, у которых репрезентативный код равен указанной строке.

Я пишу следующий запрос:

var users = from u in Context.Users
where (((u is CustomerUser) &&  ((CustomerUser)u).CustomerNumber.Equals(criteria))
|| ((u is SalesUser) && ((SalesUser)u).RepresentativeCode.Equals(criteria)))
|| u.Login.Equals(criteria) 
select u;

Запрос компилируется, но во время выполнения, когда запрос выполняется, выдается следующее исключение:

"Невозможно привести тип« MyDb.Models.User »к типу« MyDb.Models.CustomerUser ». LINQ to Entities поддерживает только приведение типов примитивов модели данных сущностей."

Как мне написать свой запрос, чтобы он работал?

ПРИМЕЧАНИЕ. Я собираюсь применить сортировку / разбиение по страницам к запросу по конвейеру, поэтому выполнение ToList (), а затем приведение типа решения мне здесь не подойдет.

1 Ответ

1 голос
/ 18 января 2011

Вы должны использовать as приведений.Вы также можете воспользоваться тем, что L2E объединяет нули:

var users = from u in Context.Users
            let customerNumber = (u as CustomerUser).CustomerNumber
            let representativeCode = (u as SalesUser).RepresentativeCode
            where customerNumber.Equals(criteria)
                  || representativeCode.Equals(criteria)
                  || u.Login.Equals(criteria)
            select u;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...