Комплекс RIA EF4 фильтр многие ко многим - PullRequest
0 голосов
/ 26 июля 2011

прежде всего извините за мой плохой английский.

У меня есть структура БД, подобная этой:

enter image description here

Используя RIA Services с EF4.1, что будет лучшим способом выбрать только автомобили, которые имеют некоторые характеристики?

На клиенте пользователь может выбрать несколько «Характеристика» и сообщить значение. Затем мне нужно показать все автомобили, имеющие эти характеристики, с этим конкретным значением («значение» сохраняется в таблице CarCharacteristic) (что-то вроде всех «автомобилей» ( Car ), которые имеют «2» ( CarCharacteristic ) «двери» ( Характеристика ))

Я хотел бы сделать это на клиенте, но, похоже, это невозможно: (

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

Проблема в том, что если я создаю запрос с любым комплексным (например, MyClass []) параметром, я получаю ошибку:

Параметр 'x' записи операции домена 'GetCarsByCharacteristic' должен быть одним из предопределенных сериализуемых типов

Я думаю, что мне здесь не хватает чего-то очевидного, потому что это не может быть так сложно ...

Как бы правильно делать такие вещи?

1 Ответ

0 голосов
/ 30 сентября 2011

Прежде всего, поскольку вы хотите отправить массив в качестве параметра запроса, вам нужно пометить запрос атрибутом HasSideEffects=true, например:

    [Query(HasSideEffects=true)]

Теперь вы МОЖЕТЕ иметь возможность отправлять свой собственный класс в качестве параметра (я не уверен, я еще не проверял), но вы определенно можете использовать параметр типа Dictionary<Guid, int>, где я предполагаю, что Guid тип, который вы используете для Ids, а int - это значение.

Теперь вы можете фильтровать набор по идентификаторам и значениям по мере необходимости.

EDIT: Кроме того, вы не упомянули об использовании DomainDataSource, поэтому я предполагаю, что вы работаете с объектом DomainContext. В этом случае вы можете добавить фильтрацию на стороне клиента следующим образом:

        ctx.Load(ctx.GetMyDataQuery().Where(entity => entity.Value = value && entity.CharacteristicId = characteristicId), false);
...