При написании метода для службы 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