Модель данных Entity, Dynamic Linq, несколько динамических таблиц, предложение Where, строго типизированные возвращаемые типы

При написании метода для службы oData у меня есть приведенный ниже linq, для которого мне нужно иметь динамическое предложение «где» для фильтрации результатов («новые» в соединениях для составных ПК в модели данных сущности):

var query = from pl in CurrentDataSource.ProductListing
             join pla in CurrentDataSource.ProductListingAttribute
                 on new {pl.ProductID, pl.WebCategoryID, pl.ParentProductID}
                 equals new {pla.ProductID, pla.WebCategoryID, pla.ParentProductID}
             join att in CurrentDataSource.Attribute
                 on pla.AttributeID
                 equals att.AttributeID
             join attItem in CurrentDataSource.AttributeItem
                 on pla.AttributeItemID
                 equals attItem.AttributeItemID
             select pl;

Мой Linq не очень хорош, и я пытаюсь использовать класс DynamicQueryable для создания предложения «где» во время выполнения (оно построено из различных переменных):

var returnData = query.Where(whereClause);

Поскольку предложение «где» фильтрует значения в сущностях Attribute и AttributeItem, оно неизменно содержит такие вещи, как

"((Attribute.Value='foo' AND AttributeItem.Value='bar') 
OR 
(Attribute.Value='sna' AND AttributeItem.Value='fu'))"

который завершится ошибкой во время выполнения, поскольку «Нет свойства или поля« Атрибут »в типе« Список продуктов »».

Я попытался создать анонимный тип в «выборе», который содержит все элементы объекта ProductListing и элементы из Attribute и AttributeItem, которые мне требуются для фильтрации, но мне нужен строго типизированный объект типа «ProductListing», чтобы вернуться из метода вызов.

Может КТО-НИБУДЬ, пожалуйста, помогите?? Должен ли я использовать динамические соединения вместо динамических Wheres? Есть ли способ определения местоположения сущностей, которые вы не выбираете? Должен ли я выбирать анонимный тип / "let" и впоследствии создавать строго типизированный объект?

Пожалуйста, любая помощь очень ценится.

рпосбо


person rposbo    schedule 28.09.2010    source источник


Ответы (1)


Решение моего конкретного запроса заключалось в следующем:

            var query = from pl in CurrentDataSource.ProductListing
                             join pla in CurrentDataSource.ProductListingAttribute
                                 on new {pl.ProductID, pl.WebCategoryID, pl.ParentProductID}
                                 equals new {pla.ProductID, pla.WebCategoryID, pla.ParentProductID}
                             join att in CurrentDataSource.Attribute
                                 on pla.AttributeID
                                 equals att.AttributeID
                             join attItem in CurrentDataSource.AttributeItem
                                 on pla.AttributeItemID
                                 equals attItem.AttributeItemID
                        select new
                        {
                            ProductListing = pl,
                            att.AttributeName,
                            attItem.AttributeValue
                        };

            var returnData = query.Where(whereClause).Select(o => o.ProductListing);

т. е. выберите анонимный тип, содержащий конкретный тип, примените к нему предложение where, а затем выберите из результата только конкретный тип.

person rposbo    schedule 28.09.2010