24 votes

C# LINQ select from list

J'ai une liste d'identifiants d'événements renvoyés par un document xml, comme indiqué ci-dessous.

public IEnumerable<EventFeed> GetEventIdsByEventDate(DateTime eventDate)
    {

        return (from feed in xmlDoc.Descendants("Show")
                from ev in feed.Elements("Event")
                where Convert.ToDateTime(ev.Attribute("Date").Value).ToShortDateString() == eventDate.ToShortDateString()
                select new EventFeed()
                {
                    EventShowCode = feed.Attribute("Code").Value
                }).ToList();  
    }

J'ai maintenant besoin d'interroger ma base de données pour faire correspondre les événements qui correspondent aux ID d'événements retournés par la méthode ci-dessus :

select * from eventsdb where eventId in GetEventIdsByEventDate()

comment puis-je faire cela en utilisant LINQ


Je n'arrive à faire fonctionner aucune des réponses.

C'est la méthode qui recherche les identifiants d'événements à partir d'un flux XML.

public IList<EventsDetails> GetEventIds(DateTime eventDate)
    {

        var eventids = (from feed in xmlDoc.Descendants("Show")
                        from ev in feed.Elements("Event")
                        where Convert.ToDateTime(ev.Attribute("Date").Value).ToShortDateString() == eventDate.ToShortDateString()
                        select new EventsDetails()
                        {
                            EventId = feed.Attribute("Code").Value
                        }).ToList();

        return eventids;
    }

voici la méthode qui recherche les événements dans ma base de données

public IEnumerable<EventFeed> GetAllEventsFromDatabase()
    {
        var allEvents = from eventsList in GetEventsList()
                        select new EventFeed()
                        {
                            EventName = eventsList.Title,
                            EventSummary = eventsList.Introduction,
                            EventShowCode = eventsList.EventId,
                            EventImageSmall = eventsList.EventImageThumbUrl,
                            EventUrl = eventsList.Url,
                            EventSortBy = eventsList.SortOrder
                        };

        return allEvents.OrderBy(x => x.EventSortBy);
    }

et voici la méthode pour rechercher tous les identifiants d'événements correspondants dans le XML qui existent dans ma base de données.

public IEnumerable<EventFeed> FilteredEvents(DateTime eventDate)
    {

        return GetAllEventsFromDatabase().Where(p => GetEventIds(eventDate).Contains<EventsDetails>(p.EventShowCode)); 
    }

le projet ne se construit pas avec l'erreur suivante :

Erreur 9 Argument '2' : ne peut pas convertir de 'string' en 'Events.EventsDetails'.

30voto

Kyaw Thurein Points 903
        var eventids = GetEventIdsByEventDate(DateTime.Now);
        var result = eventsdb.Where(e => eventids.Contains(e));

Si vous revenez List<EventFeed> dans la méthode, vous devez changer le type de retour de la méthode de IEnumerable<EventFeed> a List<EventFeed> .

13voto

fox-jazz Points 54

Comme j'ai trouvé cette question en utilisant Google, j'ai voulu aller un peu plus loin. Disons que j'ai un string[] states et un db Entity de StateCounties et je veux juste que les états de la liste soient retournés et pas tous les états StateCounties .

J'écrirais :

db.StateCounties.Where(x => states.Any(s => x.State.Equals(s))).ToList();

J'ai trouvé ceci dans l'échantillon de CheckBoxList pour nu-get.

5voto

Matteo Mosca Points 3920

Le "in" de Linq-To-Sql utilise une logique inverse par rapport à une requête SQL.

Disons que vous avez une liste d'entiers et que vous voulez trouver les éléments qui correspondent à ces entiers.

int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

var items = from p in context.Items
                 where numbers.Contains(p.ItemId)
                select p;

En tout cas, ce qui précède fonctionne bien dans linq-to-sql mais pas dans EF 1.0. Je ne l'ai pas encore essayé dans EF 4.0.

0voto

Vedran Points 666

Exécutez la méthode GetEventIdsByEventDate() et enregistrez les résultats dans une variable, puis utilisez la méthode .Contains().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X