Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# linq to sql这是最有效的代码检查吗_C#_Asp.net_Linq_Linq To Sql - Fatal编程技术网

C# linq to sql这是最有效的代码检查吗

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)| ----------- --------------- ------------- 一个频道有很多问题 一个问题有很多话题 路径是一个备用键

大家好。只是想知道这是从db获取值的最有效的方法:给定

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


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

我认为这就是您的代码试图实现的目标:

     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个单独调用有关?不,只有一个。只有当您真正尝试从枚举器中提取对象(如通道、问题、结果)时,查询才会真正运行。代码的编写方式要干净得多。我同意它并没有得到与我上面的例子完全相同的结果,但我所追求的只是一种方法学,谢谢:)代码比你所说的要干净得多。我同意它并没有得到与我上面的例子完全相同的结果,但我所追求的是一种方法论,谢谢:)谁给了一个负数?谁给了一个负号?请对此发表评论