Question C # LINQ sélectionner dans la liste


J'ai une liste d'ID d'événement 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();  
    }

Je dois maintenant interroger ma base de données pour faire correspondre les événements qui correspondent aux eventIds renvoyés par la méthode ci-dessus. donc j'aurais quelque chose comme:

select * from eventsdb où eventId dans GetEventIdsByEventDate ()

comment puis-je faire cela en utilisant LINQ


Je n'arrive pas à trouver une solution.

c'est la méthode qui recherche les événements depuis 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;
    }

c'est 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 c'est la méthode pour rechercher tous les eventIds correspondants dans le XML existant 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 parvient pas à générer avec l'erreur suivante:

Erreur 9 Argument '2': impossible de convertir de 'string' en 'Events.EventsDetails'


12
2018-06-25 09:42


origine


Réponses:


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

Si vous revenez List<EventFeed> à l'intérieur de la méthode, vous devez changer le type de retour de la méthode à partir de IEnumerable<EventFeed> à List<EventFeed>.


19
2018-06-25 10:00



À la façon dont j'ai trouvé cette question en utilisant Google, je voulais aller plus loin. Disons que j'ai un string[] states et un db Entity de StateCounties et je veux juste les états de la liste retournés et pas tous les StateCounties.

Je souhaiterai écrire:

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

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


11
2017-09-18 14:17



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

Disons que vous avez une liste d'entiers et que vous souhaitez rechercher les éléments correspondant à 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;

Quoi qu'il en soit, ce qui précède fonctionne bien dans linq-to-sql mais pas dans EF 1.0. Je n'ai pas essayé dans EF 4.0


4
2018-06-25 09:48



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


0
2018-06-25 09:46