【问题标题】:linq-to-sql is this the most efficient code reviewlinq-to-sql 这是最有效的代码审查
【发布时间】:2010-01-07 10:38:49
【问题描述】:

大家好。只是想知道这是从数据库中获取值的最有效方法:给定;

-----------    ---------------    -------------
| 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)相关的所有主题。

这是最有效的方法还是有比这个更快的方法。

【问题讨论】:

  • 有一个重复两次的子查询。如果将其分解为单独的声明,也许会更容易理解。这仍然不会导致额外访问数据库。

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


【解决方案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
}

不准确,但你明白了。您可以向上钻取,这样可以更轻松地处理对象。

【讨论】:

  • 代码比你写的更简洁。我同意它没有得到与我上面的例子完全相同的结果,但我所追求的只是一种方法,谢谢:)
【解决方案2】:

我认为这就是您的代码想要完成的任务:

     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 展平。

【讨论】:

  • 这是否与对 db 的 3 次单独调用有关?
  • 不,只有一个。只有当您真正尝试从枚举器中提取对象(如通道、问题、结果)时,才会真正运行查询。
【解决方案3】:

我假设当您更改 .Where 和 .OrderBy 的位置时,它会加快查询速度。

【讨论】:

  • ffs 谁给了减号?请在那个 cmets 上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多