Неэффективно ли, что linq to sql переводит этот запрос в формат: "select *"? - PullRequest
3 голосов
/ 23 августа 2009

Я еще не очень знаком с Linq to SQL, но меня поражает то, что это:

var articles = 
  (from a in DB.Articles
  where 
  a.ArticleId == ArticleId.Question &&
  a.DeletedAt == null &&
  a.Votes >= minVotes
  orderby a.UpdatedAt descending
  select a).
  Take(maxarticles);

переводится на это:

string query = 
  "select top 10 * from articles
  where 
  ArticleId = 1 and 
  DeletedAt is null and 
  Votes >= -5
  order by UpdatedAt desc";

Мне кажется неэффективным, что linq to sql готов пылесосить все, используя тип запроса "select *". Разве это не неэффективно?

Почему linq to sql делает это таким образом?

Ответы [ 2 ]

4 голосов
/ 23 августа 2009

Если вы хотите выбрать меньшее количество столбцов, вам придется использовать проекцию в запросе linq.

var articles = (from a in DB.Articles
    where a.ArticleId == ArticleId.Question 
        && a.DeletedAt == null 
        && a.Votes >= minVotes
    orderby a.UpdatedAt descending
    select new 
    {
       a.ArticleId,
       a.Votes
    })
    .Take(maxarticles);

Выполнение чего-либо подобного вышеперечисленному приведет к переводу SQL в следующий код:

select top 10 
         ArticleId,
         Votes
from     articles
where    ArticleId = 1 
         and DeletedAt is null
         and Votes >= -5
order by UpdatedAt desc
4 голосов
/ 23 августа 2009

Идея, стоящая за тем, чтобы не использовать «SELECT *», состоит в том, чтобы избежать появления ненужных столбцов.

В вашем случае вы специально просите linq to sql привести все столбцы, когда вы указали "выбрать"

...