----------- --------------- -------------
| Channel | |Issue | |Topic |
| path(ck)| |channelID(fk)| |issueID(fk)|
----------- --------------- -------------
我写了以下linq语句。
var content = (from c in db.Channels
where c.channel_holding_page == path
select new { c, _latestIssue = c.Issues.OrderBy(i => i.issue_created).Where(i => i.issue_isVisible == true).FirstOrDefault(), _topics = c.Issues.OrderBy(i => i.issue_created).Where(i => i.issue_isVisible == true).FirstOrDefault().Topics }).FirstOrDefault();
我希望得到(在这里倒退)与所述通道设置为公开(issue_isVisible)的最新问题(issue_created)相关的所有主题。
这是最有效的方式,还是有一种比这更快的方法。
答案 0 :(得分:1)
有时候查询效果很好,你可以向上钻取,如:
from t in Topic
join i in issues
on t.IssueID equals i.IssueID
join c in channels
on i.ChannelID equals c.ChannelID
where c.Chanel_holding_path == path
select new
{
i.issue_visible,
c.channelid,
t.topicID
}
不准确,但你得到的照片。您可以向上钻取,这样可以更轻松地处理对象。
答案 1 :(得分:0)
我认为这是您的代码正在努力实现的目标:
var channels = db.channels.Where (c => c.channel_holding_page == path);
var issues = channels.Select (c => new { c, _latestIssue = c.Issues.Where (i => i.issue_isVisible).OrderBy (i => i.issue_created).FirstOrDefault () });
var result = issues.Select (ci => new { ci.c, ci._latestIssue, ci._latestIssue.Topics }).FirstOrDefault ();
如果只有一个通道与channel_holding_page检查相匹配,那么我们可以进一步简化这一点,因为可以使用第一行中的FirstOrDefault()对通道var进行平展。
答案 2 :(得分:0)
我假设当你更改.Where和.OrderBy的位置时,它会加快查询速度。