Эффективность Linq - Как лучше всего запросить базу данных для списка значений? - PullRequest
1 голос
/ 15 декабря 2010

Допустим, у меня есть база данных терминов и список строк, это хорошая (эффективная) идея? Он работает плавно, но я не уверен, что он масштабируемый или самый эффективный.

var results =
            from t in Terms
            join x in Targets on t.Term equals x
            select t;

Здесь Термины - это таблица базы данных с индексной таблицей Термин. Targets - это IEnumerable из строк. Условия могут содержать миллионы, Цели между 10-20 строками. Есть мысли?

Ответы [ 3 ]

1 голос
/ 15 декабря 2010

В конечном счете, что касается эффективности, важно то, является ли запрос, который выполняется к базе данных, эффективным.Чтобы увидеть это, вы можете использовать SQL Profiler или найти приложение, которое покажет вам SQL, сгенерированный linq-to-sql.

Если вы используете SQL Profiler, убедитесь, что он ищет хранимые процедуры, так какLinq-to-sql использует процедуру exec_sql для выполнения запросов.

0 голосов
/ 15 декабря 2010

Хм, я не знал, что ты можешь присоединиться к местной коллекции в таком духе.Возможно, это особенность .Net 4.0?

Я часто задавал такие вопросы:

IQueryable<Term> query =
  from t in Terms 
  where Targets.Contains(t.Term)
  select t; 

Есть несколько предостережений.

  • Переменнаях должен быть List<string> ссылкой.Переменная x не может быть ссылкой IList<string>.

  • Каждая строка в списке преобразуется в параметр sql.В то время как linq to sql с радостью переведет многие тысячи строк в параметры (я видел 50k параметров), Sql Server примет только ~ 2100.Если вы превысите этот предел, вы получите исключение sql.

  • nvarchar vs varchar indexes .

0 голосов
/ 15 декабря 2010

Если вам нужно объединить две таблицы по одному ключу, как в вашем примере, нет другого способа выразить это, чем фактическое соединение.То, что у вас есть, настолько эффективно, насколько оно МОЖЕТ получить.

Однако измените select, чтобы оно возвращало только те поля, которые вас интересуют, и убедитесь, что вы их обрезаете, потому что базы данных sql любят возвращать char поля с конечными пробелами, и они требуют времени для обработки и передачи по сети.

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