2016-10-11 5 views
1

Structure des données:Comment obtenir IQueryable() au lieu de List() en utilisant LinQ?

class Journal 
{  
    public int JournalId {get; set;} 
    public DateTime JournalDate {get; set;} 
    public string OwnerId {get; set;} 
} 

class Event 
{ 
    public string EventId {get; set;} 
    public string EventName {get; set;} 
} 

Est-il possible d'obtenir d'abord tout ce que je reçois cette liste des valeurs

var events = DBContext.Events.Where(o => o.EventName.Contains(searchParam)).AsQueryable(); 
var values = events.Select(x => x.EventID).ToList(); 

Je ne sais comment mettre les résultats de la requête à la liste dans le cycle de foreach. J'ai créé une nouvelle liste y mettre toutes les valeurs où les événements dans la liste des valeurs que je besoin

JournalList = new List<Journal>(); 
foreach (string eventId in values) 
{ 
    var results = DBContext.Journals.Where(j => j.eventID.Equals (eventId)).ToList(); 
    RegJournalList.AddRange(results); 
} 

GroupedList = JournalList.Select(t => new JournalGrouped() 
{ 
    JournalID = t.JournalID, 
    JournalDate = t.JournalDate 
}).Distinct().ToList(); 

Est-il possible d'avoir IQueryable() au lieu de JournalList?

+0

Liste est IQueryable? – Liam

+0

ajouter un **. AsQueryable() ** – Radinator

+0

Je suppose que 'j.eventID.Equals (eventId)' est une faute de frappe et il devrait être 'j.JournalId ...' –

Répondre

4

Je vous suggère de regarder dans join. Il est essentiellement ce que vous essayez de faire

var result = (from event in DBContext.Events 
       where event.EventName.Contains(searchParam) 
       join journal in DBContext.Journals on event.EventID equals journal.JournalID 
       select new JournalGrouped() 
       { 
       JournalID = journal.JournalID, 
       JournalDate = journal.JournalDate 
       }).Distinct().ToList(); 

Ou mieux encore puisque vous utilisez Entity Framework utilise navigation properties et laisser le cadre faire le travail pour vous. Après avoir défini les propriétés de navigation, il ressemblera à quelque chose comme:

from journal in DBContext.Journals.Include("full name of your Event class") 
where journal.Event.EventName.Contains(searchParam) 
select new JournalGrouped() 
{ 
    JournalID = journal.JournalID, 
    JournalDate = journal.JournalDate 
} 

Si pour une raison quelconque quoi coller avec la façon dont vous le faites alors currenly:

var values = DBContext.Events.Where(o => o.EventName.Contains(searchParam)) 
          .Select(x => x.EventID); 

var GroupedList = DBContext.Journals.Where(j => values.Contain(j.eventID)) 
            .Select(t => new JournalGrouped() 
            { 
             JournalID = t.JournalID, 
             JournalDate = t.JournalDate 
            }).Distinct(); 
+0

J'utilise la propriété de navigation et j'ai essayé d'écrire un requête comme Vous avez suggéré, mais cela a pris si longtemps (62 ms) je pense que c'est trop long pour moi, mais il semble que je n'ai rien à faire .... Et je dois avoir IQueryable, parce que je dois ajouter plus de filtres Journaux ... non seulement par EventId :( – Songaila

+0

@Songaila - Je suggère alors que vous vérifiez le sql qui est généré, puis exécutez-le dans la base de données elle-même pour vérifier son plan d'explication –

+0

J'ai des données dont j'ai besoin, mais un peu longtemps à attendre ... il s'agit d'environ 2,5 millions d'enregistrements en db, alors pensez que ça ne prendra pas si longtemps ... – Songaila