linq-to-sql是最有效的代码审查

时间:2010-01-07 01:42:43

标签: c# asp.net linq linq-to-sql

嘿所有。只是想知道这是从db获取值的最有效方法:给定;

-----------    ---------------    -------------
| Channel |    |Issue        |    |Topic      |
| path(ck)|    |channelID(fk)|    |issueID(fk)|
-----------    ---------------    -------------
  • 一个渠道有很多问题
  • 一个问题有很多主题
  • path是备用密钥

我写了以下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)相关的所有主题。

这是最有效的方式,还是有一种比这更快的方法。

3 个答案:

答案 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的位置时,它会加快查询速度。