2010-11-16 5 views
3

Voici ma situation:Utiliser Contains dans ObjectQuery

J'ai une relation m: n entre les artistes et les événements. Ce que j'essaye de faire est d'obtenir un IQueryable contenant seulement des événements qui incluent un certain artiste. J'utilise un référentiel pour ma couche d'accès aux données. Il est évident que l'approche suivante ne fonctionne pas:

_db.EventSet.Include("Location").Where(e => (e.Artists.Contains(artist)) && (e.StartDate > System.DateTime.Now)).OrderBy(e => e.StartDate); 

Depuis que je suis nouveau à Entity Framework Je ne comprends pas vraiment pourquoi, mais je peux deviner. Donc, au cas où quelqu'un pourrait expliquer cela d'une manière très facile, je serais reconnaissant aussi. Quoi qu'il en soit, ma solution je suis venu avec se présente comme suit:

IQueryable<Event> events = _db.EventSet.Include("Location").Where(e => (e.EndDate > System.DateTime.Now)); 
List<Event> eventsList = new List<Event>(); 
foreach (var ev in events) 
{ 
    eventsList.Add(ev); 
} 
return (IQueryable<Event>)eventsList.AsQueryable().Where(e => e.Artists.Contains(artist)).OrderBy(e=>e.StartDate); 

du tout que cela ne une bonne solution, car sont récupérées et traitées tous les événements qui est une surcharge énorme. Y at-il quelqu'un là-bas qui pourrait me dire une meilleure solution pour mon problème? Je suis également conscient du fait que je n'ai pas vraiment compris ce qu'est un ObjectQuery et comment le convertir en IQueryable (si c'est même possible).

Je suis reconnaissant pour toutes les suggestions.

Répondre

2

Vous pouvez utiliser Any avec le champ ID de l'artiste, en supposant ici un nom de ArtistId:

_db.EventSet.Include("Location") 
      .Where(e => (e.Artists.Any(a => a.ArtistId == artist.ArtistId)) && (e.StartDate > System.DateTime.Now)) 
      .OrderBy(e => e.StartDate); 
+0

Je n'ai pas testé votre requête, mais je pense que cela ne fonctionne pas –

+0

@Saeed, pourquoi ne pas tu penses que ça marche? Certes, je ne connais pas le schéma exact de la base de données de l'OP, mais j'ai mis en place une base de données avec Events, Artists et Locations, l'ai testée, et cela a fonctionné. –

+0

Je pense, '(e.Artists.Any (a => a.ArtistId == artist.ArtistId)' n'a pas pu être manipulé, parce que vous n'avez pas de données récupérées pour faire une recherche dessus, il suffit de deviner, c'est 'EF' si c'était AsEnumerable() sans différer l'exécution comme ce que j'ai dit qu'il devrait fonctionner mais dans ce cas je pense qu'il ne peut pas faire de requête sql –

Questions connexes