linq к объектам генерировал sql

вы не можете касаться пользовательского интерфейса из фонового потока, поэтому вам нужно переместить эту строку:

listview.SetAdapter(Adapter);
for (int i = 0; i < Adapter.GroupCount; i++)
 {
      listview.ExpandGroup(i);
 }

из RunInBackground(string[] @params) в OnPostExecute(string result)

также переместить if_connected(); из RunInBackground(string[] @params) - OnPostExecute(string result), поскольку if_connected(); показывает диалоговое окно, его нельзя запустить в фоновом режиме.

. И добавьте в свой вопрос свою полную трассировку стека, поскольку там могут быть и другие ошибки, помимо упомянутых. из них.

6
задан pirho 26 February 2018 в 10:51
поделиться

5 ответов

Я не эксперт SQL, но предполагая что оба синтаксиса:

ГДЕ (БРОСОК (CHARINDEX (@p, [Extent1]. [Имя]) интервал AS)) = 1

и

ГДЕ имя КАК @p + '%'

приведет или к сканированию таблицы или идеально к индексному сканированию. Нижняя строка они выполнят то же. Я проверил это путем просмотра планов выполнения ниже. Нижняя строка, необходимо заново продумать схему базы данных или как Ваш выполняют поиск. Это не проблема LINQ.

Одна возможная область для улучшения: обеспечьте, чтобы Вы индексировали столбец, на котором Вы ищете.

сопроводительный текст http://download.binaryocean.com/plan1.gif

сопроводительный текст http://download.binaryocean.com/plan2.gif

3
ответ дан 17 December 2019 в 02:34
поделиться

Ничего себе, это - действительно причудливый способ сделать его! Обратите внимание, что LINQ-SQL (в этом случае) использует LIKE @p0 + '%'...очень странно.

Какого поставщика EF (база данных) Вы используете? SQL Server?

Как Вы говорите, хранимая процедура будет задание, но Вам не придется сделать этого... очень, очень нечетный...

2
ответ дан 17 December 2019 в 02:34
поделиться

"Действительно ли буква" является символом? Если Вы сделали это строкой, что происходит?

var results = (from c in companies
    where c.Name.StartsWith(letter.ToString())
    select c);
0
ответ дан 17 December 2019 в 02:34
поделиться

Я пытался использовать этот синтаксис вместо этого

Name.Substring(0, 1) == "E"

Этот SQL сгенерирован

WHERE N'E' = (SUBSTRING([Name], 0 + 1, 1))

Возможно, это более эффективно?

0
ответ дан 17 December 2019 в 02:34
поделиться

Это известная проблема с Linq to Entities. В отличие от LIKE, очевидно, эта конструкция не использует индексы.

У нас был некоторый успех с использованием Substring (что переводится как SUBSTRING). План выполнения аналогичен, но в нашем случае запрос выполняется гораздо быстрее.

Это еще одно «Я уверен, что это будет исправлено в EF 2» ...: - (

1
ответ дан 17 December 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: