С# 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'
Ответы
Ответ 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.