Lors de l'écriture d'une méthode pour un service oData, j'ai le linq ci-dessous, pour lequel j'ai besoin d'une clause dynamique "where" pour filtrer les résultats (les "nouveaux" dans les jointures sont pour les PK composites dans le modèle de données d'entité):
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;
Mon Linq n'est pas très bon et j'essaie d'utiliser la classe DynamicQueryable pour générer une clause "where" au moment de l'exécution (elle est construite à partir de diverses variables):
var returnData = query.Where(whereClause);
Étant donné que la clause "where" filtre sur les valeurs des entités Attribute et AttributeItem, elle contient invariablement des éléments tels que
"((Attribute.Value='foo' AND AttributeItem.Value='bar')
OR
(Attribute.Value='sna' AND AttributeItem.Value='fu'))"
qui échouera lors de l'exécution car "Aucune propriété ou champ 'Attribut' n'existe dans le type 'ProductListing'".
J'ai essayé de créer un type anonyme dans le "select" qui contient tous les éléments de l'entité ProductListing et ceux de Attribute et AttributeItem que je demande de filtrer, mais j'ai besoin d'une entité fortement typée de type "ProductListing" pour revenir de la méthode appel.
Quelqu'un peut-il aider s'il vous plait?? Dois-je utiliser des jointures dynamiques au lieu de lieux dynamiques? Existe-t-il un moyen de rechercher des entités que vous ne sélectionnez pas? Dois-je sélectionner un type / «let» anonyme et créer ensuite une entité fortement typée?
S'il vous plaît, toute aide est grandement appréciée.
rposbo
La solution à ma requête particulière était de faire ceci:
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);
c'est-à-dire, sélectionnez un type anonyme contenant un type concret, appliquez la clause where à cela, puis sélectionnez uniquement le type concret dans le résultat.