Подтвердить что ты не робот

С# LINQ выберите из списка

У меня есть список идентификаторов событий, возвращаемых из XML-документа, как показано ниже.

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

Теперь мне нужно запросить мою базу данных, чтобы она соответствовала событиям, которые равны eventIds, возвращенным из вышеупомянутого метода. поэтому у меня было бы что-то вроде:

выберите * from eventsdb, где eventId в GetEventIdsByEventDate()

как я могу это сделать с помощью LINQ


Похоже, что любой из ответов не работает.

это метод, который просматривает eventIds из 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;
    }

это метод, который просматривает события в моей базе данных

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

и это метод поиска любых соответствующих eventIds в XML, которые существуют в моей базе данных

public IEnumerable<EventFeed> FilteredEvents(DateTime eventDate)
    {

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

проект не может быть создан со следующей ошибкой:

Ошибка 9 Аргумент '2': невозможно преобразовать из 'string' в 'Events.EventsDetails'

4b9b3361

Ответ 1

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

Если вы возвращаете List<EventFeed> внутри метода, вы должны изменить тип возвращаемого метода с IEnumerable<EventFeed> на List<EventFeed>.

Ответ 2

В подобии того, как я нашел этот вопрос с помощью Google, я хотел сделать это еще на один шаг. Допустим, у меня есть string[] states и db Entity of StateCounties, и я просто хочу, чтобы состояния из возвращаемого списка, а не все StateCounties.

Я бы написал:

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

Я нашел это в образце CheckBoxList для nu-get.

Ответ 3

"in" в Linq-To-Sql использует обратную логику по сравнению с SQL-запросом.

Скажем, у вас есть список целых чисел и вы хотите найти элементы, соответствующие этим целым числам.

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;

В любом случае, это работает отлично в linq-to-sql, но не в EF 1.0. Не пробовал в EF 4.0

Ответ 4

Выполните метод GetEventIdsByEventDate() и сохраните результаты в переменной, а затем вы можете использовать метод .Contains()

Ответ 5

Я предлагаю вам:

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

Если вы возвращаете List внутри метода, вы должны изменить тип возврата метода с IEnumerable на List.