Модель данных сущностей, Dynamic Linq, предложение нескольких динамических таблиц Where, строго типизированные возвращаемые типы - PullRequest
0 голосов
/ 28 сентября 2010

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

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 для генерации предложения "where" во время выполнения (оно построено из различных переменных):

var returnData = query.Where(whereClause);

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

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

, что приведет к сбою во время выполнения, так как «Нет типа свойства или поля« Атрибут »в типе« ProductListing »».

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

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

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

rposbo

1 Ответ

0 голосов
/ 28 сентября 2010

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

            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, а затем выберите только конкретный тип из результата.

...