linq-to-sql - это самый эффективный обзор кода - PullRequest
1 голос
/ 07 января 2010

Привет всем. Просто хочу узнать, является ли это наиболее эффективным способом получения значений из базы данных: дано;

-----------    ---------------    -------------
| 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_created), которая установлена ​​как общедоступная (issue_isVisible), с указанного канала.

Это самый эффективный способ или есть способ, который был бы быстрее, чем этот.

Ответы [ 3 ]

1 голос
/ 07 января 2010

Иногда выполнение запросов работает хорошо, и вы можете развернуть, например:

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
}

Не точно, но вы получите картину. Вы можете углубиться, что облегчает работу с объектами.

0 голосов
/ 07 января 2010

Я предполагаю, что когда вы меняете местами .Where и .OrderBy, это немного ускорит запрос.

0 голосов
/ 07 января 2010

Я думаю, это то, что ваш код пытается выполнить:

     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, то мы можем упростить это немного больше, так как каналы var могут быть сглажены с помощью FirstOrDefault () прямо в первой строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...