2009-11-05 4 views
1

что различные между двумяЧем отличается LINQ к SQL, где положение

1)

context.connection.open() 

var albums = (from a in context.Albums 
       where a.id == id 
      select a); 

context.connection.close() 

2)

context.connection.open() 

var albums = (from a in context.Albums 
      select a); 

context.connection.close() 

var result = albums.where((a)=>{a.id == id}); 

было бы быстрее, используя первый один

ответ

2

Предложение where во втором случае выглядит ненадлежащим синтаксисом, кроме открытия/закрытия соединения, которое они должны оценивать тот же код. То есть SQL будет сгенерирован и выполнен, когда набор результатов фактически перечислит.

Вы можете опустить остальную часть кода и просто написать:

var albums = from a in context.Albums 
      where a.id == id 
      select a; 

или

var albums = context.Albums.Where(a => a.id == id); 

Они будут вычисляться точно такой же вещи, когда результаты перечислены.

+0

Спасибо за весь ваш ответ .. Хм .. Я немного смущен Слоем данных. Означает ли это, что контекст данных, который мы создали в vs.net, уже представляющий логический уровень данных ... – LittleFunny

1

Существует очень небольшая разница из-за так называемого вырожденных запросов. Помимо подключения синхронизации, первый эффективно вызова:

var albums = contact.Albums 
        .Where(a => a.id == id); 

в то время как второй будет иметь дополнительный Select вызов в нем:

var albums = contact.Albums 
        .Select(x => x) 
        .Where(a => a.id == id); 

Сказав это, я бы, конечно, ожидать, LINQ к SQL для выдать тот же SQL в обоих случаях.

1

Quintin is right. Там будет только (большой) разница, если бы вы сразу оценить запрос:

var albums = (from a in context.Albums 
       where a.id == id 
       select a) 
      .ToList(); // force query evaluation 
         // 'SELECT * from Albums where id = ...' 

против

var albums = (from a in context.Albums 
       select a) 
       .ToList(); // force query evaluation 
         // 'SELECT * from Albums' 

var result = context.Albums.Where(a => a.id == id); // filters the list in memory 
1

Чтобы понять, почему нет никакой разницы, рассмотрим, как LINQ к SQL работ поставщика. Когда вы используете таблицы DataContext, вы используете IQueryProvider. Каждый раз, когда вы используете такое предложение, как Where, Select, OrderBy и т. Д., Вы ничего не выполняете - каждое из этих выражений предоставляется только IQueryProvider, а IQueryProvider делает большой длинный список предложений.

Когда вы выполняете запрос путем итерации результатов, эти выражения собираются, объединены вместе и превращаются в запрос T-SQL. Поэтому не важно, когда вы добавляете выражения или какой порядок вы их добавляете, до тех пор, пока это произойдет, прежде чем вы заходите на результаты.

Смежные вопросы