C# 如何使用LinQ获取IQueryable()而不是List()?

C# 如何使用LinQ获取IQueryable()而不是List()?,c#,linq,entity-framework-6,code-first,iqueryable,C#,Linq,Entity Framework 6,Code First,Iqueryable,数据结构: 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;} } 有什么办法可以

数据结构:

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;}
}
有什么办法可以到达吗 首先,我得到了这个值列表

var events = DBContext.Events.Where(o => o.EventName.Contains(searchParam)).AsQueryable();
var values = events.Select(x => x.EventID).ToList();
我只知道如何在foreach循环中将查询结果放入列表。我创建了一个新的列表,将所有的值放在我需要的值列表中的事件所在的位置

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();
有没有办法让IQueryable代替Journalist?

我建议你考虑加入。这基本上就是你想要做的

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();
或者更好,因为您正在使用实体框架,并让框架为您完成工作。定义导航属性后,其外观如下所示:

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
}
如果出于某种原因,你需要坚持目前的做法,那么:

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();
我建议你考虑加入。这基本上就是你想要做的

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();
或者更好,因为您正在使用实体框架,并让框架为您完成工作。定义导航属性后,其外观如下所示:

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
}
如果出于某种原因,你需要坚持目前的做法,那么:

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

列表是IQueryable?附加a.AsQueryableI假设j.eventID.Equals eventID是一个输入错误,应该是j.JournalId…列表是IQueryable?附加a.AsQueryableI假设j.eventID.Equals eventID是一个输入错误,应该是j.JournalId…我正在使用导航属性,并尝试按照您的建议编写查询,但是花了这么长时间62毫秒,我觉得对我来说太长了,但似乎我没事做。。。。我需要IQueryable,因为我需要在日志中添加更多过滤器。。。不仅通过EventId:@Songaila-我建议您检查生成的sql,然后在数据库中执行它,以检查其解释计划。我得到了需要的数据,但等待的时间有点长。。。它大约有250万条记录,以db为单位,所以我想不会花那么长时间的。。。这是有道理的,需要时间。但是检查解释计划-看看连接是如何执行的,也许可以改进。DBA有一个堆栈交换,也许您可以做一些预处理-processing@Songaila-请考虑接受我的回答,因为它解决了在问题的范围内描述的问题:我使用导航属性并试图写一个像你建议的查询,但是它花了太长的62毫秒,我认为它对我来说太长了,但我似乎没什么事要做。。。。我需要IQueryable,因为我需要在日志中添加更多过滤器。。。不仅通过EventId:@Songaila-我建议您检查生成的sql,然后在数据库中执行它,以检查其解释计划。我得到了需要的数据,但等待的时间有点长。。。它大约有250万条记录,以db为单位,所以我想不会花那么长时间的。。。这是有道理的,需要时间。但是检查解释计划-看看连接是如何执行的,也许可以改进。DBA有一个堆栈交换,也许您可以做一些预处理-processing@Songaila-请考虑接受我的回答,因为它解决了问题范围内描述的问题: