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-请考虑接受我的回答,因为它解决了问题范围内描述的问题: