2010-06-25 27 views
12

Tengo una lista de identificadores de sucesos volvió de un documento XML como se muestra a continuaciónC# LINQ seleccionar de la lista

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

ahora tengo que consultar mi base de datos para que coincida con los eventos que son iguales a los eventIds regresaron del método anterior. Así que tendría algo como:

seleccionar * de eventsdb donde eventId en GetEventIdsByEventDate()

cómo puedo hacer esto utilizando LINQ


i parece que no puede conseguir ninguna de las respuestas de trabajo.

este es el método que busca los eventIds de una fuente 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; 
    } 

este es el método que busca los eventos en mi base de datos

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

y este es el método para buscar hasta cualquier eventIds coincidentes en el XML que existen en mi base de datos

public IEnumerable<EventFeed> FilteredEvents(DateTime eventDate) 
    { 

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

el proyecto fracasa para construir con el siguiente error:

Error 9 Argumento '2': no ​​se puede convertir de 'cadena' a '' Events.EventsDetails

+0

kb: ¿Ya tienes una respuesta definitiva para esto? Podrías marcarlo para que sepamos la respuesta correcta a esto. – theraneman

Respuesta

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

Si está returnning List<EventFeed> dentro del método, debe cambiar el tipo de retorno método de IEnumerable<EventFeed> a List<EventFeed>.

0

ejecutar el método GetEventIdsByEventDate() y guardar los resultados en una variable y, a continuación, puede utilizar el método .Contains()

4

El "en" en Linq-To-Sql utiliza una lógica inversa en comparación con una consulta SQL.

Digamos que tiene una lista de enteros y desea encontrar los elementos que coinciden con esos enteros.

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; 

De todos modos, lo anterior funciona bien en linq-to-sql pero no en EF 1.0. no lo han intentado en EF 4,0

11

En semejanza de cómo encontré esta pregunta usando Google, quería dar un paso más. Digamos que tengo un string[] states y un db Entity de StateCounties y solo quiero que se devuelvan los estados de la lista y no todos los StateCounties.

que iba a escribir:

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

He encontrado esto dentro de la muestra de CheckBoxList de nu-get.