C# linq to sql这是最有效的代码检查吗
大家好。只是想知道这是从db获取值的最有效的方法:给定C# linq to sql这是最有效的代码检查吗,c#,asp.net,linq,linq-to-sql,C#,Asp.net,Linq,Linq To Sql,大家好。只是想知道这是从db获取值的最有效的方法:给定 ----------- --------------- ------------- | Channel | |Issue | |Topic | | path(ck)| |channelID(fk)| |issueID(fk)| ----------- --------------- ------------- 一个频道有很多问题 一个问题有很多话题 路径是一个备用键
----------- --------------- -------------
| Channel | |Issue | |Topic |
| path(ck)| |channelID(fk)| |issueID(fk)|
----------- --------------- -------------
- 一个频道有很多问题
- 一个问题有很多话题
- 路径是一个备用键
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)相关的所有主题
这是最有效的方法还是有比这更快的方法。我认为这就是您的代码试图实现的目标:
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 ();
如果只有一个通道与通道保持页面检查相匹配,那么我们可以将其简化一点,因为通道变量可以在第一行中使用FirstOrDefault()展平 我认为这就是您的代码试图实现的目标:
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 ();
如果只有一个通道与通道保持页面检查相匹配,那么我们可以将其简化一点,因为通道变量可以在第一行中使用FirstOrDefault()展平 有时向下查询效果很好,您可以向上查询,如:
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
}
不确切,但你知道了。您可以向上钻取,这样可以更轻松地处理对象。有时向下查询效果很好,您可以向上钻取,如:
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
}
不确切,但你知道了。您可以钻取更容易处理对象的位置。我假设当您更改.Where和.OrderBy的位置时,它会加快查询速度。我假设当您更改.Where和.OrderBy的位置时,它会加快查询速度。有一个子查询会重复两次。如果将其分解成一个单独的声明,也许会更容易理解。这仍然不会导致额外的数据库访问。有一个子查询会重复两次。如果将其分解成一个单独的声明,也许会更容易理解。这仍然不会导致额外的数据库访问。那么这会涉及到对数据库的3个单独调用吗?不,只有一个。只有当您实际尝试从枚举器中提取对象(如通道、问题、结果)时,查询才会实际运行。这是否与对db的3个单独调用有关?不,只有一个。只有当您真正尝试从枚举器中提取对象(如通道、问题、结果)时,查询才会真正运行。代码的编写方式要干净得多。我同意它并没有得到与我上面的例子完全相同的结果,但我所追求的只是一种方法学,谢谢:)代码比你所说的要干净得多。我同意它并没有得到与我上面的例子完全相同的结果,但我所追求的是一种方法论,谢谢:)谁给了一个负数?谁给了一个负号?请对此发表评论