2014-06-20 2 views
4

Existe-t-il un moyen d'intégrer la requête à la sous-classe?Entity framework faire cas sur le discriminateur

Si je serais Quering que la sous-classe unique que je ferais

auctions.OfType<AuctionBid>().Where(auctionBid => auctionBid.AuctionBidProp) 

Maintenant, je voudrais faire un cas sur le type de sous-classe

auctions.Where(auction => 
    (auction is AuctionBid) && ((AuctionBid) auction).Prop == 1 
    || (auction is AuctionBuy) && ((AuctionBuy) auction).Prop == 1) 

est-il la façon de le faire?

Bien sûr, la ligne ci-dessus donne une erreur: LINQ to Entities ne prend en charge que le lancement de types de primitives EDM ou d'énumération.

+0

La lecture de toutes (ou de certaines) enchères en mémoire, puis l'utilisation de LINQ est-elle une option viable dans votre cas? –

+1

Je préfère avoir une pagination appropriée du côté de la base de données. Pour l'instant j'ai ajouté un champ mappé supplémentaire en tant que discriminateur et j'ai déplacé la propriété nécessaire à la classe de base. – llapinski

Répondre

3

La seule option que je vois est d'interroger les sous types séparément et concaténer les résultats:

auctions.OfType<AuctionBid>() 
     .Where(auctionBid => auctionBid.AuctionBidProp == 1) 
     .Cast<AuctionBase> 
     .Concat(auctions.OfType<AuctionBuy>() 
         .Where(auctionBuy => auctionBuy.AuctionBidProp == 1) 
       ) 
     .OrderBy(ab => ab.Prop1) 
     .Skip(pages * pageSize) 
     .Take(pageSize) 

Cela va générer une requête UNION ALL. Ce n'est pas l'approche la plus efficace par rapport au SQL fait à la main, mais peut-être acceptable (vous devrez essayer).

+0

Peut-être qu'un sproc qui gère la pagination serait viable puisque comme vous l'avez souligné, la requête générée peut manquer de performance. –

+0

Apparemment, c'est la meilleure façon de le faire et de rester avec la syntaxe EF Linq. – llapinski

Questions connexes