【问题标题】:How to get IQueryable() instead of List() using LinQ?如何使用 LinQ 获取 IQueryable() 而不是 List()?
【发布时间】:2017-02-19 21:14:36
【问题描述】:

数据结构:

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() 代替JournalList

【问题讨论】:

  • 列表是 IQueryable 的吗?
  • 附加一个 .AsQueryable()
  • 我认为j.eventID.Equals (eventId) 是一个错字,应该是j.JournalId...

标签: c# linq entity-framework-6 code-first iqueryable


【解决方案1】:

我建议您查看join。这基本上就是你想要做的事情

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

或者更好的是,因为您使用的是实体框架,请使用 navigation properties 并让框架为您完成工作。定义导航属性后,它将如下所示:

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

【讨论】:

  • 我正在使用导航属性并尝试像您建议的那样编写查询,但是花了很长时间(62 毫秒)我认为这对我来说太长了,但我似乎无事可做。 ...而且我需要 IQueryable,因为我需要向 Journals 添加更多过滤器...不仅通过 EventId :(
  • @Songeila - 我建议您检查生成的 sql,然后在数据库本身中执行它以检查其解释计划。
  • 我得到了我需要的数据,但是等待的时间有点长...数据库中大约有 250 万条记录,所以认为不会花这么长时间...
  • 是的...这确实需要时间。但是检查解释计划 - 看看连接是如何执行的,也许它可以改进。 DBA 有一个堆栈交换,也许你可以做一些预处理
  • @Songeila - 请考虑接受我的回答,因为它解决了问题范围中描述的问题:)
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
相关资源
最近更新 更多