2010-09-28 7 views
0

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 (le « nouveau » s dans les jointures sont pour PKs composites dans l'Entity Data Model):Entité Data Model, Dynamic Linq, table multiple dynamic Clause Where, types de retour fortement typés

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 est pas très bon et je suis en train d'utiliser la classe DynamicQueryable pour générer un « where » à l'exécution (il est construit à partir de diverses variables):

var returnData = query.Where(whereClause); 

Depuis la clause "where" filtres sur des valeurs dans l'attribut et entités AttributeItem qu'il contient toujours des choses comme

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

qui échouera à l'exécution depuis « Aucune propriété ou attribut « » champ existe dans le type « ProductListing » ». J'ai essayé de construire un type anonyme dans le "select" qui contient tous les éléments de l'entité ProductListing et ceux de Attribute et AttributeItem dont j'ai besoin pour filtrer, mais j'ai besoin d'une entité fortement typée de type "ProductListing" pour retour de l'appel de méthode.

Quelqu'un peut-il aider? Dois-je utiliser des jointures dynamiques au lieu de Wheres dynamiques? Y a-t-il un moyen de faire face aux entités que vous ne sélectionnez pas? Dois-je choisir un type anonyme/"let" et construire une entité fortement typée après?

S'il vous plaît, toute aide est massivement appréciée.

rposbo

Répondre

0

La solution à ma question particulière a été de le faire:

  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); 

par exemple, sélectionner un type anonyme contenant un type de béton, appliquer la clause where qui sélectionnez uniquement le type de béton à partir du résultat.